【问题标题】:Create a list column with ranges set by existing columns创建一个列表列,其范围由现有列设置
【发布时间】:2020-12-02 08:11:41
【问题描述】:

我正在尝试在数据框中创建一个列表列,使用现有列指定范围,例如:

# A tibble: 3 x 3
      A     B C         
  <dbl> <dbl> <list>    
1     1     6 c(1, 2, 3, 4, 5, 6)
2     2     5 c(2, 3, 4, 5)
3     3     4 c(3, 4)

关键是它需要按如下方式创建:

df %>% mutate(C = c(A:B))

我有一个包含作为范围输入的整数的数据集,即有人输入了“7 到 26”。我已将范围分为 A 和 B 两列,或“开始”和“结束”,并希望使用 c(A:B) 创建一个列表,但使用 dplyr 我不断得到:

Warning messages:
1: In a:b : numerical expression has 3 elements: only the first used
2: In a:b : numerical expression has 3 elements: only the first used 

这给出了:

# A tibble: 3 x 3
      A     B C         
  <dbl> <dbl> <list>    
1     1     6 list(1:6)
2     2     5 list(1:6)
3     3     4 list(1:6)

有没有人遇到过类似的问题并找到了解决方法?

【问题讨论】:

    标签: r list dataframe dplyr


    【解决方案1】:

    你可以在purrr中使用map2()

    library(dplyr)
    
    df %>%
      mutate(C = purrr::map2(A, B, seq))
    

    或者在mutate()之前做rowwise()

    df %>%
      rowwise() %>% 
      mutate(C = list(A:B)) %>%
      ungroup()
    

    两种方法都给出

    # # A tibble: 3 x 3
    #       A     B C        
    #   <int> <int> <list>   
    # 1     1     6 <int [6]>
    # 2     2     5 <int [4]>
    # 3     3     4 <int [2]>
    

    数据

    df <- tibble::tibble(A = 1:3, B = 6:4)
    

    【讨论】:

    • 非常感谢!我可以确认这两种方法都适用于我的用例。我想我会选择rowwise() 版本,您希望看到两种方法之间的性能差异吗?
    • @DJH 我认为两者都很接近,但map2() 方式可能会快一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多