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
你可以使用lapply
和replace
,然后你只是看一个矢量或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的键值