【问题标题】:R - Dplyr - get() not applying to every column, only uses first occurrenceR - Dplyr - get() 不适用于每一列,只使用第一次出现
【发布时间】:2021-02-05 14:28:00
【问题描述】:

我有一个看起来像这样的 DF:

V1  V2  V3  V4  V5  V6
1251    V5  12  7   13  91
126 V5  17  9   75  90
912 V6  55  34  88  22

我正在尝试获取 V2 中引用的列的值。

对于第 1 行和第 2 行,V2 列引用V5。对于第 3 行,V2 引用 V6

使用 dplyr 我试图获取 V2 中引用的列的对应值。

df %>%
   mutate(V2_ref_value = get(V2)) %>%
   select(V1, V2, V2_ref_value)

这会返回一个奇数的df:

V1  V2  V2_ref_value
1251    V5  13
126 V5  75
912 V6  88

显示了第 1 行和第 2 行的正确值,但第 3 行还显示了 V5 列中的值,而不是其引用列 V6 中的值。

正确的输出应该是:

V1  V2  V2_ref_value
1251    V5  13
126 V5  75
912 V6  22

有谁知道为什么会发生这种情况或我该如何解决这个问题?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您需要逐行执行:

    df %>%
     rowwise() %>%
     mutate(V2_ref_value = get(V2))
    
         V1 V2       V3    V4    V5    V6 V2_ref_value
      <int> <chr> <int> <int> <int> <int>        <int>
    1  1251 V5       12     7    13    91           13
    2   126 V5       17     9    75    90           75
    3   912 V6       55    34    88    22           22
    

    或者你也可以这样做,不需要rowwise()

    df %>%
     mutate(V2_ref_value = Reduce(`+`, across(-c(V1:V2), ~ (cur_column() == V2) * .)))
    

    【讨论】:

      【解决方案2】:

      我们可以在base R中使用向量化的行/列子集

      df$V2_ref_value <- as.numeric(df[cbind(seq_len(nrow(df)), 
             match(df$V2, names(df)))])
      

      -输出

      df
      #    V1 V2 V3 V4 V5 V6 V2_ref_value
      #1 1251 V5 12  7 13 91           13
      #2  126 V5 17  9 75 90           75
      #3  912 V6 55 34 88 22           22
      

      数据

      df <- structure(list(V1 = c(1251L, 126L, 912L), V2 = c("V5", "V5", 
      "V6"), V3 = c(12L, 17L, 55L), V4 = c(7L, 9L, 34L), V5 = c(13L, 
      75L, 88L), V6 = c(91L, 90L, 22L)), class = "data.frame", row.names = c(NA, 
      -3L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多