【发布时间】:2021-08-18 13:00:17
【问题描述】:
让我们考虑两个数据框:
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 的列名是df1 的转换列名(df2 的列名总是格式为@987654327 @)。
因此,我想将 df1 中的列替换为 df2 中修改了列名的列。例如:
列“A”应替换为 A_log(相同的列名并添加 _log)。现在我们要替换 df1 中的“C”列,因为我们有两列从 df2 中的“C”开始,那么我们将用 df2 中的两列替换 df1 中的一列“C”。我们不替换列"B" 和"D",因为在df2 中没有以这些字母开头的变量
即我想要一个输出:
Alog 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
我目前的工作
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
在我看来,这个解决方案非常好 - 可以肯定它是有效的。它的最大缺点是它使用了循环,在这种情况下可能没有必要。你认为也许还有其他更好的方法可以做到这一点,或者循环是可以避免的?
【问题讨论】: