我的数据名称有10列,比如说(a1-a10)。我想创建一个新的,有三十列,比如说(a1,b1,c1,... a10,b10,c10),从较小的一个复制。如果列不存在较小的列,则列将在较大的列中保留为空白。有没有办法实现这个没有循环比较和复制。非常感谢您的任何帮助和建议。
答案 0 :(得分:2)
像这样的东西。请注意,大多数代码只是创建一个合适的测试用例:
old_df <- data.frame(a1 = rnorm(10), a5 = rnorm(10))
new_names <- paste0("a", 1:30)
使用您想要的任何名称创建新的data.frame()。
new_df <- as.data.frame(matrix(NA, nrow= nrow(old_df), ncol = length(new_names)))
names(new_df) <- new_names
这只是将旧data.frame中具有名称的列替换为旧data.frame中的列。除非新行具有相同的行数,否则无效!
new_df[, names(old_df)] <- old_df # This is the line you want
答案 1 :(得分:1)
假设名称匹配,这不是很难矢量化。我将使用一个简单的数据框作为例子。
data_1 <- data.frame(a=1:20, b=2:21, c=3:22)
首先,我们需要初始化新的数据框。
data_2 <- data.frame(e=rep(NA, nrow(data_1)), b=NA, a=NA, d=NA)
现在,我们复制了所有内容,注意不要假设新列的顺序相同。我已经把它扩展到比使示例更容易理解所需的更多行。
matched_columns <- match(names(data_1), names(data_2))
copy_column <- !is.na(matched_columns)
destination_column <- matched_columns[copy_column]
data_2[,destination_column] <- data_1[,copy_column]
我们在这里做的是找到匹配列名的索引,为data_2中data_1列的存在创建一个TRUE / FALSE向量,然后使用这些索引将数据从data_1复制到data_2。
答案 2 :(得分:0)
我不完全确定你在循环比较和复制方面的要求,但是这会对你的特定数据集进行少量修改(无论看起来如何):
a <- c(1,2,3)
b <- c("a","b","c")
c <- c("do", "re", "mi")
mydf <- data.frame(a,b,c)
mynewdf <- data.frame(matrix(vector(), dim(mydf)[1] , 0))
for(i in 1:dim(mydf)[2]){
for(j in 1:3){
mynewdf <- cbind(mynewdf, mydf[ ,i])
colnames(mynewdf)[dim(mynewdf)[2]] <- paste(colnames(mydf)[i],as.character(j))
}
}