R语言 根据存储在另一个框架中的变量名获取相应的值?

khbbv19g  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(94)

在一个tibble中,我的值是另一个tibble中的变量名。我需要以快速的方式列出第一个tibble每行中包含的列名的第二个tibble中特定行中的值。我如何才能做到这一点?
我的数据具有以下形式:

# Observations in is tibble says which variables of the tibble_b occurred at each case:
tibble_a <- tribble(
        ~a, ~b, ~c,
         4,  2,  5,
         4,  3,  1,
         2,  5,  5
        )
# This tibble contains values for the variables at different times:
tibble_b <- tribble(
        ~`1`, ~`2`, ~`3`, ~`4`, ~`5`,
         100,  112,   98,  107,   85,
          71,   76,   97,   80,   15,
           2,   61,   54,   37,   42
         )

字符串
我需要创建一个tibble,它包含tibble_b中第一个数字的值,比如说,第一行,tibble_a中的所有行。也就是说,基本上,要获得这个表格数据:
| 一|B| C|
| --|--|--|
| 107 | 112 | 85 |
| 107 | 98 | 100 |
| 112 | 85 | 85 |
我的问题是,tibble_a有几十万行,当然,两者都有更多的列。因为我必须对tibble_b的行索引的多个样本进行测试和比较,使用下面的方法非常耗时。

for(current_row in 1:nrow(tibble_a)) { 
  for(current_col in 1:3) {
   tibble_of_results[[current_row, current_col]] <- tibble_b[[1, tibble_a[[current_row, current_col]]]] 
  }
}


有人能提出一个有效的方法来完成这项任务吗?

ss2ws0br

ss2ws0br1#

library(dplyr)

tibble_a |>
  mutate(across(everything(), \(x) unlist(tibble_b[1, x], use.names = F)))
#       a     b     c
#   <dbl> <dbl> <dbl>
# 1   107   112    85
# 2   107    98   100
# 3   112    85    85

字符串
您可以使用列的值到列索引tibble_b。例如,对于tibble_a[[1]]

tibble_b[1, c(4, 4, 2)]
#     `4`   `4`   `2`
#   <dbl> <dbl> <dbl>
# 1   107   107   112


然后我们简单地使用unlist将其转换为向量。然后我们可以使用across(everything(), ...)将这种方法应用于所有列。

knsnq2tg

knsnq2tg2#

下面是使用purrr包的函数式编程方法:

fetch_values <- function(row) {
  map_dbl(tibble_a[row, ], ~tibble_b[[1, .x]])
}

map_dfr(seq_len(nrow(tibble_a)), fetch_values)

 A tibble: 3 × 3
      a     b     c
  <dbl> <dbl> <dbl>
1   107   112    85
2   107    98   100
3   112    85    85

字符串

uz75evzq

uz75evzq3#

library(dplyr)
library(tidyr)

tibble_a %>% 
  tibble::rownames_to_column("id") %>% 
  pivot_longer(-id, values_to = "var") %>% 
  right_join(., 
             {tibble_b[1,] %>% pivot_longer(everything(), 
                                names_transform = as.numeric, 
                                names_to = "var")})  %>% 
  pivot_wider(id_cols = -var)

#> Joining with `by = join_by(var)`
#> # A tibble: 3 × 4
#>   id        a     b     c
#>   <chr> <dbl> <dbl> <dbl>
#> 1 1       107   112    85
#> 2 2       107    98   100
#> 3 3       112    85    85

字符串
创建于2023-12-28带有reprex v2.0.2

2hh7jdfx

2hh7jdfx4#

如果只是tibble_b的第一行(不确定),我们可以这样做

quickdf = \(l) {
  class(l) = "data.frame"
  attr(l, "row.names") = .set_row_names(length(l[[1L]]))
  l
}
tibble_a = quickdf(tibble_a) # tibble_a = as.data.frame(tibble_a) 
tibble_a[] = as.numeric(tibble_b[1L, ]
                 [match(unlist(tibble_a, use.names = FALSE), colnames(tibble_b))])

字符串

> tibble_a
    a   b   c
1 107 112  85
2 107  98 100
3 112  85  85


阅读有关quickdf()的更多信息第24.4.2章。

相关问题