快速替换R中数据帧中的值

Ben*_* B. 19 replace r dataframe

我有一个150,000行的数据框,其中2,000列包含值,有些是负数.我将这些负值替换为0,但这样做非常慢(约60分钟或更长).

df[df < 0] = 0

这里df[,1441:1453]看起来像(所有列/值的数字):

  V1441 V1442 V1443 V1444 V1445 V1446 V1447 V1448 V1449 V1450 V1451 V1452 V1453
1     3     1     0     4     4    -2     0     3    12     5    17    34    27
2     0     1     0     7     0     0     0     1     0     0     0     0     0
3     0     2     0     1     2     3     6     1     2     1    -6     3     1
4     1     2     3     6     1     2     1    -6     3     1    -4     1     0
5     1     2     1    -6     3     1    -4     1     0     0     1     0     0
6     1     0     0     1     0     0     0     0     0     0     1     2     2
Run Code Online (Sandbox Code Playgroud)

有没有办法加快这样的过程,例如我这样做的方式非常慢,而且有更快的方法吗?谢谢.

Rol*_*and 30

尝试将df转换为矩阵.

df <- data.frame(a=rnorm(1000),b=rnorm(1000))
m <- as.matrix(df)
m[m<0] <- 0
df <- as.data.frame(m)
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 22

您的原始方法和当前答案都会在创建时创建与m(或df)相同大小的对象m<0(矩阵方法更快,因为与内部复制[<-相比,内部复制更少[<-.data.frame

你可以使用lapplyreplace,然后你只是看一个矢量或length (nrow(df))每次都不要复制那么多

df <- as.data.frame(lapply(df, function(x){replace(x, x <0,0)})
Run Code Online (Sandbox Code Playgroud)

上面的代码应该非常有效.

如果使用data.table,则data.frame删除该方法的大部分内存(和)时间效率低下.它非常适合像您这样的大数据情况.

library(data.table)
# this really shouldn't be 
DT <- lapply(df, function(x){replace(x, x <0,0)})
# change to data.table
setattr(DT, 'class', c('data.table','data.frame'))
# or 
# DT <- as.data.table(df, function(x){replace(x, x <0,0)})
Run Code Online (Sandbox Code Playgroud)

您可以在所有列上设置键,然后通过引用替换小于0的键值