使用R替换庞大数据帧中的值

时间:2015-06-18 05:39:00

标签: r dataframe subset

我有一个巨大的数据帧(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)}))

有任何帮助吗?感谢。

2 个答案:

答案 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