如何根据列名替换列? 让我们考虑两个数据帧: df1 <- data.frame("A" = c(1, 1, 2), "B" = 2:4, "C" = 3:5, "D" = 1:3) > df1 A B C D 1 1 2 3 1 2 1 3 4 2 3 2 4 5 3 df2 <- data.frame("A_log" = log(c(1, 1, 2)), "C_diff" = diff(c(2,4,1,7)), "C_log" = log(3:5)) > df2 A_log C_diff C_log 1 0.0000000 2 1.098612 2 0.0000000 -3 1.386294 3 0.6931472 6 1.609438
我目前的工作 在我看来,这个解决方案非常好——它确实有效。它最大的缺点是使用循环,在这种情况下可能不需要循环。您是否认为有其他更好的方法可以做到这一点,或者循环是可以避免的?您可以按原样使用df2,并从df1中选择子集不在df2中的列 子“_173.*”名称DF2部分可能特定于实际数据集中的列名。在本例中,您拥有的模式是ColumnNameFromdf1_somethingelse,因此我从列名中删除了_somethingelse,只保留df1中可用的部分,因此它返回如何根据列名替换列? 让我们考虑两个数据帧: df1 <- data.frame("A" = c(1, 1, 2), "B" = 2:4, "C" = 3:5, "D" = 1:3) > df1 A B C D 1 1 2 3 1 2 1 3 4 2 3 2 4 5 3 df2 <- data.frame("A_log" = log(c(1, 1, 2)), "C_diff" = diff(c(2,4,1,7)), "C_log" = log(3:5)) > df2 A_log C_diff C_log 1 0.0000000 2 1.098612 2 0.0000000 -3 1.386294 3 0.6931472 6 1.609438,r,string,dataframe,loops,R,String,Dataframe,Loops,我目前的工作 在我看来,这个解决方案非常好——它确实有效。它最大的缺点是使用循环,在这种情况下可能不需要循环。您是否认为有其他更好的方法可以做到这一点,或者循环是可以避免的?您可以按原样使用df2,并从df1中选择子集不在df2中的列 子“_173.*”名称DF2部分可能特定于实际数据集中的列名。在本例中,您拥有的模式是ColumnNameFromdf1_somethingelse,因此我从列名中删除了_somethingelse,只保留df1中可用的部分,因此它返回 sub('_.*', ''
sub('_.*', '', names(df2))
#[1] "A" "C" "C"
您可以尝试检查df1的每个名称,使用grep在df2中搜索名称,如果找到,则返回那些表单df2,否则返回表单df1
嘿,罗纳克!非常感谢你的回答!我对您的解决方案的唯一问题是,您的列排列方式不同。第一列是转换后的列A_log、C_diff、C_log,然后是未转换的列B、D。如果你看一下我得到的输出,那就是我正在寻找的东西,即变量布局没有改变,B仍然在AIf之后,如果你将cbind的输出存储在结果中。您可以执行result[gtools::mixedsortnamesresult]以获得所需的订单。
for (i in seq_len(ncol(df1))) {
# Obtain next column names of df1
df1.colname <- colnames(df1)[i]
# Compare patterns of df1.colname with df2 column names and look for similarities.
which_match <- which(grepl(df1.colname, colnames(df2)))
if (length(which_match) >= 1) {
df3 <- cbind(df3, df2[which_match])
}
else {
df3 <- cbind(df3, df1[i])
}
}
> df3[, -1]
A_log B C_diff C_log D
1 0.0000000 2 2 1.098612 1
2 0.0000000 3 -3 1.386294 2
3 0.6931472 4 6 1.609438 3
cbind(df2, df1[setdiff(names(df1), sub('_.*', '', names(df2)))])
# A_log C_diff C_log B D
#1 0.0000000 2 1.098612 2 1
#2 0.0000000 -3 1.386294 3 2
#3 0.6931472 6 1.609438 4 3
sub('_.*', '', names(df2))
#[1] "A" "C" "C"
do.call(cbind, lapply(names(df1), function(x) {
i <- grep(paste0("^", x, "_"), names(df2))
if(length(i) > 0) df2[i]
else df1[x]
}))
# A_log B C_diff C_log D
#1 0.0000000 2 2 1.098612 1
#2 0.0000000 3 -3 1.386294 2
#3 0.6931472 4 6 1.609438 3