R data.table,如果大于0,则替换每个单元格值1

时间:2016-11-27 18:09:40

标签: r data.table

我有R data.table 共有25列,第1列是ID,24列是整数变量。有近1M亿行。如何将所有这些非零值转换为1

Custid  A   B  C
123     0   8  0
124     0   0  6

应该成为

Custid  A   B  C
123     0   1  0
124     0   0  1

3 个答案:

答案 0 :(得分:5)

假设您的data.table被称为'dt',

df = as.data.frame(dt)
df[,-1] = (df[,-1] != 0)*1

的工作原理。 -1索引表示不包含第一列,然后在括号内返回true或false语句,*1确保以数字形式返回结果。

如果您愿意,可以将其转回data.table。

dt = data.table(df)

答案 1 :(得分:3)

一个有效的选项是set函数,它可以替换。使用for循环遍历列,并将set'value'循环到1,其中元素不等于0,指定'i'和'j'索引。

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

之后循环遍历Data.table的子集
dt[, names(dt)[-1] := lapply(.SD, function(x) as.integer(x!=0)), .SDcols = 2:ncol(dt)]

答案 2 :(得分:1)

这也应该有用

apply(df, 1, function(x) {ifelse(any(x > 0), 1, 0)})