Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 创建作为其他列向量的新列_R_Dplyr_Apply_Lapply_Mutate - Fatal编程技术网

R 创建作为其他列向量的新列

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")

我有一个包含两列(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)
                 )

提前谢谢

您可以使用
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