我有一个 R data.table,共有 25 列,第一列是 ID,24 列是整数变量。总共有接近100万行数据。我该如何将所有非零值转换为1?
Custid A B C
123 0 8 0
124 0 0 6
Should become
Custid A B C
123 0 1 0
124 0 0 1
我有一个 R data.table,共有 25 列,第一列是 ID,24 列是整数变量。总共有接近100万行数据。我该如何将所有非零值转换为1?
Custid A B C
123 0 8 0
124 0 0 6
Should become
Custid A B C
123 0 1 0
124 0 0 1
df = as.data.frame(dt)
df[,-1] = (df[,-1] != 0)*1
这段代码的作用是:将数据表转换成向量(vector),-1
索引表示不包含第一列,括号内部返回一个真或假的语句,而*1
则确保结果以数字形式返回。
如果需要,您可以将其转回数据表(data.table)格式。
dt = data.table(df)
一种高效的选项是使用set
函数进行就地替换。使用for
循环遍历列,并通过指定和j索引,将“value”设置为1,其中元素不等于0。
for(j in 2:ncol(dt)){
set(dt, i= which(dt[[j]]!=0), j=j, value =1)
}
dt
# Custid A B C
#1: 123 0 1 0
#2: 124 0 0 1
另一种选项是使用lapply
通过循环遍历数据表的子集,在指定.SDcols
之后进行操作。
dt[, names(dt)[-1] := lapply(.SD, function(x) as.integer(x!=0)), .SDcols = 2:ncol(dt)]
apply(df, 1, function(x) {ifelse(any(x > 0), 1, 0)})