我有一个 data.frames sampleList
列表。该列表中的每个 data.frame 在列及其顺序方面都略有不同。
我还有另一个 data.frame
refData1
,我想将其用作具有相同标题的列类的其余部分的模型。
换句话说,我希望更新 sampleList
,并且任何具有 refData1
的匹配列都应该更改其类并反射(reflect) refData1< 中的类类型
对应的列。不匹配的列应保持原样。请注意,refData1
还包含列表中所有 data.frames 都没有的列。谢谢。
sampleData1 <- data.frame(id = 1:10,
gender = as.factor(sample(c("Male", "Female"),
10, replace = TRUE)),
age = as.character(rnorm(10, 40, 10)),
height = as.character(rnorm(10,170,5)))
sampleData2 <- data.frame(weight = as.character(rnorm(10,80,5)),
gender = sample(c("Male", "Female"),
10, replace = TRUE),
id = 11:20,
age = rnorm(10, 44, 10))
sampleData3 <- data.frame(id = as.factor(21:30),
age = as.character(rnorm(10, 36, 10)),
gender = sample(c("Male", "Female"), 10,
replace = TRUE),
score = as.character(rnorm(10,20,2)))
sampleList <- list(sampleData1,sampleData2,sampleData3)
refData1 <- data.frame(id = 1:10, # numeric
gender1 = as.character(sample(c("Male", "Female"),
10, replace = TRUE)),
agen = rnorm(10, 40, 10), # numeric
height = rnorm(10,170,5), # numeric
weight = rnorm(10,80,5), # numeric
other = as.factor(sample(c("a", "b","c"),
10, replace = TRUE)))
最佳答案
我们循环遍历“sampleList”,获取与“refData1”相交的列,将 data.frame 的类
设置为“refData1”中的类
sampleListN <- lapply(sampleList, function(x) {
nm1 <- intersect(names(x), names(refData1))
x[nm1] <- Map(function(u, v) {class(u) <- class(v)
u},
x[nm1], refData1[nm1])
x})
正如@mt1022提到的,如果我们按照逻辑,那么直接转换为整数
的factor
列可能会产生问题,因为我们错误的值,即整数存储值而不是实际值。根据数据,我们甚至不需要与“refData1”进行比较。我们可以使用 type.convert
lapply(sampleList, function(x) {
nm1 <- intersect(names(x), names(refData1))
x[nm1] <- lapply(x[nm1], function(x)
type.convert(as.character(x), as.is = TRUE))
x})
关于r - 从其他 data.frame R 分配 data.frame 列类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51787443/