使用区分变量将数据帧复制n次

时间:2019-04-10 03:52:42

标签: r dplyr purrr

我想通过复制$ git ls-tree refs/heads/master 100644 blob ba1d886a431eeefae6e86ea82e4b32f58e555482 README.md 100644 blob 255991c16bfa8ceda1f910ca8c2c9a76176074cc aws.mdwn 040000 tree 1b65cfb9fab80cb19ca874f24eec18f4a33441ba aws 100644 blob f9c0fa22a6b36daae4a258825fa14ee970c55db9 cloudbuild.yaml 100644 blob 1a1720e89e8f7e5782404d1dcde409f93fa2b3a3 debian.mdwn 040000 tree be830bc70f66503f3723b68293d1c2be171ba491 debian 100644 blob e24269417aa5afaa14b8d77a2af6d484bb132e91 gcp.mdwn 040000 tree c9470904cac2c9b4ecfc2d129a295414d3f91b35 gcp 100644 blob 96a0c8fc32b7ccb9d16a68beb20f471e4b3e2c8f git.mdwn 040000 tree 84249e1a63519cfc1865f241caa03ff2c8276f70 git 100644 blob fe6ec42d23f3a35945f16ebe2f088c937b6a4fe0 gpg.mdwn 100644 blob 22c4923e6233039f7a5280eeeeeeb358765989dc index.mdwn 100644 blob baa1399e4948a8f1456fa80100f08a369ce84439 ldap.mdwn 040000 tree d777c11680977d00b244877e6ee43a548c6d956a ldap 100644 blob b30f876c9c054b304d30d584e3407da0f940419c local.css $ git cat-file -s refs/heads/master:cloudbuild.yaml 364 次来增长foo,并使用唯一变量的新变量来区分n的每个副本。如果foo为3,我可以通过以下方式进行详细说明:

n

我正在尝试找到一种更简单的方法。理想情况下,我希望将解决方案放在library(tidyverse) foo <- mtcars %>% filter(row_number() < 3) # desired result bind_rows( foo %>% mutate(key = "a"), foo %>% mutate(key = "b"), foo %>% mutate(key = "c") ) #> mpg cyl disp hp drat wt qsec vs am gear carb key #> 1 21 6 160 110 3.9 2.620 16.46 0 1 4 4 a #> 2 21 6 160 110 3.9 2.875 17.02 0 1 4 4 a #> 3 21 6 160 110 3.9 2.620 16.46 0 1 4 4 b #> 4 21 6 160 110 3.9 2.875 17.02 0 1 4 4 b #> 5 21 6 160 110 3.9 2.620 16.46 0 1 4 4 c #> 6 21 6 160 110 3.9 2.875 17.02 0 1 4 4 c foo一起传递到的一行中。

我(失败)%>%尝试:

purrr

2 个答案:

答案 0 :(得分:3)

我们可以使用

library(tidyverse)
set_names(replicate(3, foo, simplify = FALSE), letters[1:3])  %>% 
               bind_rows(.id = 'key')

或使用uncount

uncount(foo, 3) %>% 
    mutate(key = rep(letters[1:3], each = 2))

或与unnest

foo %>% 
   mutate(key = list(letters[1:3])) %>% 
   unnest
#  mpg cyl disp  hp drat    wt  qsec vs am gear carb key
#1  21   6  160 110  3.9 2.620 16.46  0  1    4    4   a
#2  21   6  160 110  3.9 2.620 16.46  0  1    4    4   b
#3  21   6  160 110  3.9 2.620 16.46  0  1    4    4   c
#4  21   6  160 110  3.9 2.875 17.02  0  1    4    4   a
#5  21   6  160 110  3.9 2.875 17.02  0  1    4    4   b
#6  21   6  160 110  3.9 2.875 17.02  0  1    4    4   c

答案 1 :(得分:3)

在尝试使用purrr时,做foo %>%并没有帮助您,因为您不需要foo作为map_dfr的第一个参数。相反,您可以执行以下操作:

map_dfr(c("a", "b", "c"), ~ mutate(foo, key = .x))

如果您想继续使用管道,但又不想将foo作为第一个参数传递,则可以在map_dfr周围加上{},以禁止自动传递参数:

foo %>%
    { map_dfr(c("a", "b", "c"), function(x) { mutate(., key = x)}) }

(使用不同的magrittr管道可能会有更优雅的方法,我主要坚持使用%>%