Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据列名替换列? 让我们考虑两个数据帧: 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 - Fatal编程技术网

如何根据列名替换列? 让我们考虑两个数据帧: 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

如何根据列名替换列? 让我们考虑两个数据帧: 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('_.*', ''

我目前的工作

在我看来,这个解决方案非常好——它确实有效。它最大的缺点是使用循环,在这种情况下可能不需要循环。您是否认为有其他更好的方法可以做到这一点,或者循环是可以避免的?

您可以按原样使用df2,并从df1中选择子集不在df2中的列

子“_173.*”名称DF2部分可能特定于实际数据集中的列名。在本例中,您拥有的模式是ColumnNameFromdf1_somethingelse,因此我从列名中删除了_somethingelse,只保留df1中可用的部分,因此它返回

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