我有一个巨大的数据帧(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)}))
有任何帮助吗?感谢。
答案 0 :(得分:1)
对我来说,看起来你在这里有一个因素,我认为重新命名你的因素可能会更好。我找到了this漂亮的页面,在那里他们给出了一些如何做到这一点的例子。
如果你想得到一个数字列,你可以考虑在替换你的关卡后做as.numerical()
之类的事情。
答案 1 :(得分:1)
正如评论中所提到的,所请求的data.frame相当大,以适应合理桌面计算机的内存,也许R不是这项工作的工具。
在任何情况下,对于比请求数小1000倍的data.frame,这是一种方法。
首先模拟一些数据:
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
然后使用apply
以及mapvalues
包中的plyr
函数转换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