使用 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
然后使用 apply
与 plyr
包中的 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
我有一个巨大的数据框 (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
然后使用 apply
与 plyr
包中的 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