从其他data.frame R分配data.frame列类
我有一个数据列表。frames从其他data.frame R分配data.frame列类,r,list,class,dataframe,typeof,R,List,Class,Dataframe,Typeof,我有一个数据列表。framessampleList。列表中的每个data.frame在列及其顺序方面都有点不同 我还有另一个data.framerefData1,我想用它作为其余部分的模型,按照标题相同的列的类别 换句话说,我希望更新sampleList,任何与refData1匹配的列都应该更改它们的类,并反映相应列的refData1中的类类型。不匹配的列应保持原样。请注意,refData1也包含列表中所有data.frames都没有的列。多谢各位 sampleData1 <- data.
sampleList
。列表中的每个data.frame在列及其顺序方面都有点不同
我还有另一个data.frame
refData1
,我想用它作为其余部分的模型,按照标题相同的列的类别
换句话说,我希望更新sampleList
,任何与refData1
匹配的列都应该更改它们的类,并反映相应列的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)))
sampleData1我们在“sampleList”中循环,获取intersect
ing列与“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})
我在编译代码时遇到这个错误:“as.factor(id=21:30)中的错误:未使用的参数(id=21:30)”抱歉,我纠正了这个错误。工作非常出色-谢谢@akrun!如果可以的话,还有一个问题-现在我如何将sampleListN
合并到一个big data.frame中,但仅限于出现在refData1
中的那些列?@MIH如果它是基R,那么Reduce(函数(…)merge(…,by=columnsofinterest),c(refData1,sampleListN))
合并不清楚,因为refData1的某些列是连续的。在将因子转换为数字类型时,请小心。有时需要将第一个转换为字符类型。在本例中,第三个data.frame的id变为1:10,而不是21:30.True@mt1022-如果列名与refData1
中的列名匹配,我是否应该将所有因子转换为列表中的字符,或者它是否可以以某种方式压缩为@akrun完成的整洁代码段?实际上,我是通过plyr
libraryldplly来实现的(sampleListN,data.frame)
然后我将只留下我需要的列。非常感谢@akrun!
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})