【问题标题】:Replace values from dataframe where vector values match indexes in another dataframe替换数据框中的值,其中向量值与另一个数据框中的索引匹配
【发布时间】:2018-06-16 09:14:39
【问题描述】:

也许问题和答案已经发布了,但我找不到。此外,有没有解决这个问题的最佳方法? 因为这只是一些行的示例,但我会将其应用于大约 100 万行的数据框。

我对 R 有点陌生。

我有两个数据框

DF1:
   a b
1  1 0
2  2 0
3  2 0
4  3 0
5  5 0

和

DF2
  l
1 A
2 B
3 C
4 D
5 E

我尝试做的是将 DF1$a 中的值与 DF2 的索引进行匹配,并将这些值分配给 DF1$b,这样我的结果将如下所示。

DF1:
   a b
1  1 A
2  2 B
3  2 B
4  3 C
5  5 E

我已经编写了一个 for 循环来执行此操作,但似乎我遗漏了一些东西

for(i in 1:length(df1$a)){
  df1$b[i] <- df2$l[df1$a[i]]
}

这会引发以下结果:

DF1:
   a b
1  1 1
2  2 2
3  2 2
4  3 3
5  5 5

提前致谢:)

【问题讨论】:

  • 索引在 R 中是矢量化的。试试df1$b&lt;- df2$l[df1$a]。

标签: r vector indexing match matching


【解决方案1】:

我们可以使用merge根据row id和a合并两个数据框。

# Create example data frame
DF1 <- data.frame(a = c(1, 2, 2, 3, 5))
DF2 <- data.frame(l = c("A", "B", "C", "D", "E"),
                  stringsAsFactors = FALSE)

# Create a column called a in DF2 shows the row id
DF2$a <- row.names(DF2)

# Merge DF1 and DF2 by a
DF3 <- merge(DF1, DF2, by = "a", all.x = TRUE)

# Change the name of column l to be b
names(DF3) <- c("a", "b")

DF3
#   a b
# 1 1 A
# 2 2 B
# 3 2 B
# 4 3 C
# 5 5 E

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 2018-05-01
    • 2019-03-23
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多