我有一个data.frame,dim = 400行和15000列。我想申请一个条件,对于属于每个组的行(由df$Group
定义),我必须检查组中是否有超过50%的行中的值。如果是,则保留现有值,否则全部替换为0
。根据组的条件(按行)替换每列中的值data.frame
例如,对于基团的df[1:6,1]
, if sum(df[1:6,1] == 0)/length(df[1:6,1]) >50%
,然后在df[1:6,1]
所有值将被与0
替换。否则现有的价值将保持不变。
样品输入:
df <- read.table(text= "DATA r1 r2 r3 Group
a1 6835 256 0 a
a2 5395 0 67 a
a3 7746 0 30 a
a4 7496 556 50 a
a5 5780 255 0 a
a6 6060 603 0 a
b1 0 0 0 b
b2 0 258 0 b
b3 0 0 0 b
b4 0 0 0 b
b5 5099 505 0 b
b6 0 680 0 b
c1 8443 4900 280 c
c2 8980 4949 0 c
c3 7828 0 0 c
c4 6509 3257 0 c
c5 6563 0 49 c
", header=TRUE, na.strings=NA,row.name=1)
dt <- as.data.table(df) #or data.frame
预期输出:
>df
DATA r1 r2 r3 Group
a1 6835 256 0 a
a2 5395 0 67 a
a3 7746 0 30 a
a4 7496 556 50 a
a5 5780 255 0 a
a6 6060 603 0 a
b1 0 0 0 b
b2 0 258 0 b
b3 0 0 0 b
b4 0 0 0 b
b5 0 505 0 b
b6 0 680 0 b
c1 8443 4900 0 c
c2 8980 4949 0 c
c3 7828 0 0 c
c4 6509 3257 0 c
c5 6563 0 0 c
太好了!,谢谢@ juba。就是我在找什么! data.table真的让我们大量的数据集的计算时间。 – Shiv
+1我编辑过使用'.N'而不是'length(v)'。希望好的。 –
@MatthewDowle不能和'lapply'一起工作 - 你需要沿着'lapply(.SD,function(v,.N){...},.N)'行做(除非我'正在运行'data.table'的旧版本,并且该问题已得到解决?) – eddi