【问题标题】:How to replace several variables with several variables from another dataframe in R using a loop?如何使用循环将多个变量替换为 R 中另一个数据帧中的多个变量?
【发布时间】:2021-03-19 01:54:48
【问题描述】:

我想用 R 中第二个数据帧中的变量替换多个变量。

df1$var1 <- df2$var1
df1$var2 <- df2$var2

# and so on ...

正如您所见,两个数据帧中的变量名称相同,但是数值略有不同,而正确的版本在 df2 中,但需要在 df1 中。我需要为复杂数据集中的许多变量执行此操作,并想知道是否有人可以帮助以更有效的方式对此进行编码(可能不使用列引用)。

这里有一些示例数据:

# dataframe 1
var1 <- c(1:10)
var2 <- c(1:10)
df1 <- data.frame(var1,var2)

# dataframe 2
var1 <- c(11:20)
var2 <- c(11:20)
df2 <- data.frame(var1,var2)

# assigning correct values
df1$var1 <- df2$var1
df1$var2 <- df2$var2

【问题讨论】:

  • 两个数据框的尺寸是否相同(行数和列数相同)?如果是这样,为什么不简单地使用df2 继续前进。也许您应该发布 actual 数据和问题,因为这似乎过于简单。如果不同的行/列在唯一标识符上考虑 merge 然后分配。
  • 感谢 Parfait,抱歉,这太简单了。我是新来的,不确定它是如何“工作”的; df2 只有我需要替换的变量(所以与 df1 相同的行,更少的列);我正在考虑merge,因为我有一个 ID 变量,但不知何故认为可能有一种不同的方式,而不必事后重新排列 df 的顺序(因此只是替换值)。

标签: r loops replace assign


【解决方案1】:

正如 Parfait 所说,当前的帖子似乎有点过于简单,无法立即提供帮助,但我会尝试总结一下您可能需要什么才能让这样的事情发挥作用。

如果假设df1df2 具有相同的行数并且它们的顺序已经匹配,那么您可以通过以下子集表示法轻松实现这一点:

df1[,c({column names df1}), drop = FALSE] <- df2[, c({column names df2}), drop = FALSE]

假设df1 具有列abc,并且您想用两列df1 替换bc,其列是x、@ 987654332@, z.

df1[,c("b","c"), drop = FALSE] <- df2[, c("y", "z"), drop = FALSE]

在这里,我们将b 替换为y,并将c 替换为zdrop 参数只是为了增加对子集 data.frame 的保护,以确保您不会得到向量。

如果您不知道顺序是否正确,或者一个数据框的大小可能与另一个不同,但是两个 data.frames 之间有一个唯一标识符 - 那么我个人会使用一个旨在合并两个数据框的函数数据帧。根据您的偏好,您可以使用 base 中的 merge 或使用 dplyr 包中的 *_join 函数(我的偏好)。

library(dplyr)
#assuming a and x are unique identifiers that can be matched.
new_df <- left_join(df1, df2, by = c("a"="x"))  

【讨论】:

  • 谢谢贾斯汀!它们实际上具有相同的行数并且顺序匹配,因此您的评论和代码非常有用!
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 2012-09-16
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
相关资源
最近更新 更多