如何为来自不同 Dataframe 的匹配数据赋值

pobjuy32  于 2023-03-27  发布在  其他
关注(0)|答案(3)|浏览(116)

我有两个这样的数据框:

df1 <- data.frame(v1 = c("l", "b", "c", "i", "e", "h", "g"),
                  v2 = c("a", "c", "b", "f", "g", "n", "m"),
                  v3 = c("m", "h", "f", "c", "d", "j", "k"))

df2 <- data.frame(v1 = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"),
                  v2 = c(1,6,5,4,2,9,7,3,2,1,4,5,6,9))

我想要的是将df2的字母的匹配数字与df1相关联,然后将这些值的总和添加到新的列中。这些值不会在同一行中重复,但可以在不同的行和不同的列中找到。(例如值“c”)
我发现了一种使用ifelse的方法,如下所示:

for (i in 1:nrow(df1)){

ifelse([i,] == "a", df1$total[i] <- df1$Total[i] + df2[1,2], df1$Total[i])

}

但是这样,我需要为每个值编写不同的ifelse语句。
我想要的结果应该是这样的:

v1    v2    v3    Total
l     a     c     11
b     c     h     14
c     b     f     20
i     f     c     16
e     g     d     13
h     n     j     15
g     m     k     17
uyto3xhc

uyto3xhc1#

下面是一个使用dplyr的选项:

library(dplyr)

df1 <- data.frame(v1 = c("l", "b", "c", "i", "e", "h", "g"),
                  v2 = c("a", "c", "b", "f", "g", "n", "m"),
                  v3 = c("m", "h", "f", "c", "d", "j", "k"))

df2 <- data.frame(v1 = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"),
                  v2 = c(1,6,5,4,2,9,7,3,2,1,4,5,6,9))

df1 %>% 
  rowwise() %>% 
  mutate(total = df2$v2[df2$v1 == v1] + df2$v2[df2$v1 == v2] + df2$v2[df2$v1 == v3]) %>% 
  ungroup()
#> # A tibble: 7 × 4
#>   v1    v2    v3    total
#>   <chr> <chr> <chr> <dbl>
#> 1 l     a     m        12
#> 2 b     c     h        14
#> 3 c     b     f        20
#> 4 i     f     c        16
#> 5 e     g     d        13
#> 6 h     n     j        13
#> 7 g     m     k        17
zbdgwd5y

zbdgwd5y2#

对于基数R,我们可以使用apply来匹配所有单元格的值,然后使用rowSums来匹配这些值。

df1$Total <- rowSums(apply(df1, c(1, 2), \(x) df2[df2$v1 == x, 2]))

  v1 v2 v3 Total
1  l  a  m    12
2  b  c  h    14
3  c  b  f    20
4  i  f  c    16
5  e  g  d    13
6  h  n  j    13
7  g  m  k    17
zsohkypk

zsohkypk3#

有两种方法可以解决您的问题:

# way 1
df3$total = Reduce(`+`, lapply(df1, \(x,y) y[x], setNames(df2$v2, df2$v1)))

# or
library(kit)
df1$total = psum(lapply(df1, vswitch, df2$v1, df2$v2))

  v1 v2 v3 total
1  l  a  m    12
2  b  c  h    14
3  c  b  f    20
4  i  f  c    16
5  e  g  d    13
6  h  n  j    13
7  g  m  k    17

相关问题