根据组(按行)data.frame 根据条件替换每列中的值

标签 r dataframe data.table

我有一个 data.frame,dim = 400 行和 15000 列。我想应用一个条件,对于属于每个组的行,由 df$Group 定义,我必须检查该组是否在超过 50% 的行中具有值。如果是,则保留现有值,否则全部替换为 0

例如,对于组 a df[1:6,1]如果 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

最佳答案

更新:这个错误,#4957现在固定在 v1.8.11 .来自 NEWS :

Fixing #5007 also fixes #4957, where .N was not visible during lapply(.SD, function(x) ...) in j. Thanks to juba for noticing it here on SO: Replace values in each column based on conditions according to groups (by rows) 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")]

给出:

   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

关于根据组(按行)data.frame 根据条件替换每列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19094771/

相关文章:

python - 按周和月聚合 Pandas 数据框

r - data.table 在合并中分配 `sapply`

r - write.csv 用于大型 data.table

r - 通过 RCurl 从 ftp 下载压缩文件

将参数从 R 返回到 bash

python - 访问 PySpark 数据框中的特定项目

r - 在 R 中使用 data.table 进行聚合

r - 排列 : Speed up, 预测和/或多线程

r - 根据 data.table 中特定列的多个条件标记行

python - 在 Pandas DataFrame 中将字符串列直接转换为日期格式(不是日期时间)