How to create a variable that indicate where the d

2020-05-03 11:11发布

问题:

My question is what I said in the title, and I found Duck's question same as mine (How to create in R new variable for each element in a list of data frames with the name of data frame and its value equal to position of the element).

Within my poor knowledge in R, I can't understand well the code though it really got what I wanted.

I know my code can't run but I though the code should like this :

# create a fake data
df1 <- split(mtcars,mtcars$cyl)

# add a new variable that indicate where the element from in the list with the element name
df2 <- map(df1, mutate(from = names(df1)))

Any help will be highly appreciated!

回答1:

You can use imap from purrr to include name of the list as new column

purrr::imap(df1, ~dplyr::mutate(.x, from = .y))

#$`4`
#    mpg cyl  disp  hp drat    wt  qsec vs am gear carb from
#1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    4
#2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2    4
#3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2    4
#4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1    4
#5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    4
#6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1    4
#7  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1    4
#8  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1    4
#9  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2    4
#10 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2    4
#11 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2    4

#$`6`
#   mpg cyl  disp  hp drat    wt  qsec vs am gear carb from
#1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    6
#2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    6
#3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    6
#....

In base R we can use Map

Map(cbind, df1, from = names(df1))
#Same as 
#purrr::map2(df1, names(df1), cbind)


回答2:

Another base R option:

split(transform(mtcars, from=cyl), mtcars$cyl)


回答3:

We can use transform with Map in base R

Map(transform, df1, from = names(df1))