【问题标题】:Creating a new column which is a vector of other columns创建一个新列,它是其他列的向量
【发布时间】:2019-06-28 01:08:50
【问题描述】:

我有一个包含两列(V1 和 V2)的数据框,我想创建另一个向量列 - 通过组合函数:c() - 将其他列作为参数。

我将 dplyr 用于所有任务,所以我也想在这种情况下使用它。

我尝试使用 apply 函数创建新列,但它返回一个包含所有行(不是按行)的向量,这让我感到惊讶,因为它与其他函数一起按行工作。

我已经使用 rowwise 函数解决了这个问题,但由于它通常效率不高,我想看看是否还有其他选择。

这里是数据框的定义:

IDs <- structure(list(V1 = c("1", "1", "6"),
                      V2 = c("6", "8", "8")),
                 class = "data.frame",
                 row.names = c(NA, -3L)
                 )

这是列的创建(together1 是错误的结果,而 together2 是好的结果):

IDs <-
  IDs %>% 
  mutate(together1 = list(mapply(function (x,y) c(x,y), V1, V2))
        ) %>%
  rowwise() %>% 
  mutate(together2 = list(mapply(function (x,y) c(x,y), V1, V2))
        ) %>% 
  ungroup()

以下是打印结果:

print(as.data.frame(IDs))

V1 V2        together1 together2
1  1  6 1, 6, 1, 8, 6, 8      1, 6
2  1  8 1, 6, 1, 8, 6, 8      1, 8
3  6  8 1, 6, 1, 8, 6, 8      6, 8

提前致谢!

【问题讨论】:

    标签: r apply lapply dplyr


    【解决方案1】:

    你可以用purrrmap2函数来做到这一点:

    library(dplyr)
    library(purrr)
    
    IDs %>% 
      mutate(together = map2(V1, V2, ~c(.x, .y)))
    

    【讨论】:

    • 感谢您的回复!
    【解决方案2】:

    您刚刚在mapply() 通话中错过了SIMPLIFY = FALSE

    dplyr::mutate(IDs, togeher = mapply(c, V1, V2, SIMPLIFY = F))
    
      V1 V2 togeher
    1  1  6    1, 6
    2  1  8    1, 8
    3  6  8    6, 8
    

    【讨论】:

    • 为什么 sapply(V1, c, V2, simple = FALSE) 或 lapply(V1, c, V2) 不起作用?
    • 试着像lapply() 一样思考:) 对于来自V1 的每个条目,它需要整个V2 并将它们连接起来,例如c(V1[i], V2) 用于来自i 的所有i
    • 谢谢,你完全正确。但另一个问题:为什么使用 SIMPLIFY = F?使用 mapply(c, V1, V2) 您只需计算 c(V1[i], V2[i])
    • 是的,但使用 SIMPLIFY = T 时会返回 matrix。如果您尝试使用SIMPLIFY = T 运行相同的代码,则会出现错误Column togeher must be length 3 (the number of rows) or one, not 6,这可能是因为dplyr 将矩阵视为向量。在这种特殊情况下,我不确定我是否理解幕后发生的事情。
    • 非常感谢您的解释 :)
    【解决方案3】:

    pmap 可以在这里使用

    library(tidyverse)
    IDs %>% 
       mutate(together = pmap(unname(.), c)) 
    #  V1 V2 together
    #1  1  6     1, 6
    #2  1  8     1, 8
    #3  6  8     6, 8
    

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多