使用 R 替换巨大数据框中的值

Replacing values in a huge dataframe using R

我有一个巨大的数据框 (600,000 x 12,000),我需要替换一些值。 我试过如下,但需要3个多小时:

mydata[mydata = “AA”] <- 0
mydata[mydata = “AB”] <- 1
mydata[mydata = “BA”] <- 1
mydata[mydata = “BB”] <- 2
mydata[mydata = “--”] <- 5

我也试过了,但是不行:

mydata <- as.data.frame(apply(mydata, function(x){replace(x, x == "AA",0)}))
mydata <- as.data.frame(lapply(mydata, function(x){replace(x, x == "AB",1)}))
mydata <- as.data.frame(lapply(mydata, function(x){replace(x, x == "BA",1)}))
mydata <- as.data.frame(lapply(mydata, function(x){replace(x, x == "BB",2)}))
mydata <- as.data.frame(lapply(mydata, function(x){replace(x, x == "--",5)}))

有什么帮助吗?谢谢

对我来说,您似乎在这里有一个因素,我认为重命名您的因素可能会更好。我发现 this 不错的页面,他们在其中提供了一些示例,您可以如何做到这一点。 如果您想以数字列结束,您可以考虑在替换关卡后做类似 as.numerical() 的事情。

如评论中所述,所请求的 data.frame 相当大,无法容纳合理的台式机内存,也许 R 不是这项工作的工具。

无论如何,data.frame 比要求的小 1000 倍,这是一种方法。

先模拟一些数据:

set.seed(10001)
mydata = as.data.frame(matrix(sample(c("AA", "AB", "BA", "BB", "--"), 7200, replace = T), 
                       nrow = 600, ncol = 12))

head(mydata)
  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
1 BA AB AB BA BB BB BA AA BA  BA  AA  BA
2 BB AB AA BA AA AA BB AB --  --  AA  --
3 AB -- -- BB BB -- BA AA AB  BA  AA  AB
4 -- BB BA AB BB BA BA BB AA  --  BA  BA
5 BB AA BA BB -- BA AB BB AA  BB  BB  --
6 AB -- AA BB BB BA -- -- AB  --  AA  AB

然后使用 applyplyr 包中的 mapvalues 函数一起转换 data.frame 的每一列:

library(plyr)

# Vectors of values to transform
from_this = c("AA", "AB", "BA", "BB", "--")
to_this = c(0, 1, 1, 2, 5)

# Apply mapvalues to each column of data.frame
## I'm assuming that you want the new values to be of numeric type
new_mydata = apply(mydata, 2, 
                   function(x) as.numeric(as.character(mapvalues(x, from_this, to_this))))

这给出:

head(new_mydata)
     V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
[1,]  1  1  1  1  2  2  1  0  1   1   0   1
[2,]  2  1  0  1  0  0  2  1  5   5   0   5
[3,]  1  5  5  2  2  5  1  0  1   1   0   1
[4,]  5  2  1  1  2  1  1  2  0   5   1   1
[5,]  2  0  1  2  5  1  1  2  0   2   2   5
[6,]  1  5  0  2  2  1  5  5  1   5   0   1