Shi*_*hiv 1 r dataframe data.table
我有一个data.frame,dim = 400行和15000列.我想应用一个条件,对于属于每个组的行,由df$Group我来定义,我必须检查该组是否具有超过50%的行的值.如果是,则保留现有值,否则全部替换0.
例如,对于组a 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
Run Code Online (Sandbox Code Playgroud)
预期产量:
>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
Run Code Online (Sandbox Code Playgroud)
更新:此错误,#4957现已在v1.8.11中修复.来自新闻:
固定#5007还修复#4957,在那里
.N时是不可见lapply(.SD, function(x) ...)在j.感谢juba在SO上注意它:根据组(按行)data.frame替换每列中的值
这是一种方式data.table:
dt[, lapply(.SD, function(v) {
len <- length(v)
if((sum(v==0)/len)>0.5) rep(0L,len) else v
}), by="Group", .SDcols=c("r1","r2","r3")]
Run Code Online (Sandbox Code Playgroud)
这使 :
Group r1 r2 r3
1: a 6835 256 0
2: a 5395 0 67
3: a 7746 0 30
4: a 7496 556 50
5: a 5780 255 0
6: a 6060 603 0
7: b 0 0 0
8: b 0 258 0
9: b 0 0 0
10: b 0 0 0
11: b 0 505 0
12: b 0 680 0
13: c 8443 4900 0
14: c 8980 4949 0
15: c 7828 0 0
16: c 6509 3257 0
17: c 6563 0 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2184 次 |
| 最近记录: |