R 创建作为其他列向量的新列
我有一个包含两列(V1和V2)的数据帧,我想创建另一列,它是一个向量-通过组合函数:c()-将其他列作为参数 我对所有任务都使用dplyr,所以我也希望在这种情况下使用它 我曾尝试使用apply函数创建新列,但它返回一个包含所有行的向量(不是按行),这让我感到惊讶,因为对于其他函数,它按行工作 我已经用rowwise函数解决了这个问题,但由于它通常效率不高,我想看看是否还有其他选择 以下是数据帧的定义:R 创建作为其他列向量的新列,r,dplyr,apply,lapply,mutate,R,Dplyr,Apply,Lapply,Mutate,我有一个包含两列(V1和V2)的数据帧,我想创建另一列,它是一个向量-通过组合函数:c()-将其他列作为参数 我对所有任务都使用dplyr,所以我也希望在这种情况下使用它 我曾尝试使用apply函数创建新列,但它返回一个包含所有行的向量(不是按行),这让我感到惊讶,因为对于其他函数,它按行工作 我已经用rowwise函数解决了这个问题,但由于它通常效率不高,我想看看是否还有其他选择 以下是数据帧的定义: IDs <- structure(list(V1 = c("1", "1", "6")
IDs <- structure(list(V1 = c("1", "1", "6"),
V2 = c("6", "8", "8")),
class = "data.frame",
row.names = c(NA, -3L)
)
提前谢谢 您可以使用
purr
的map2
功能:
library(dplyr)
library(purrr)
IDs %>%
mutate(together = map2(V1, V2, ~c(.x, .y)))
您刚刚错过了
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
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
为什么sapply(V1,c,V2,simplify=FALSE)或lappy(V1,c,V2)不起作用呢?试着像
lappy()
:)一样思考V1
中的每个条目,它需要整个V2
并将它们串联起来,就像c(V1[i],V2)
中的所有i
一样。谢谢,你完全正确。但另一个问题是:为什么要使用SIMPLIFY=F?使用mapply(c,V1,V2)只需计算c(V1[i],V2[i]),是的,但是使用SIMPLIFY=T
它返回矩阵。如果您尝试使用SIMPLIFY=T
运行相同的代码,则会出现错误列,其长度必须为3(行数)或1,而不是6
,这可能是因为dplyr将矩阵视为向量。我不确定我是否理解在这种特殊情况下引擎盖下发生的事情。非常感谢您的解释:)谢谢您的回复!
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
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