R 通过Lappy向数据帧列表添加不同的字符

R 通过Lappy向数据帧列表添加不同的字符,r,list,character,lapply,R,List,Character,Lapply,我想将char向量的各个元素作为列添加到data.frames列表中。我可以手动操作,但有没有更优雅的lapply方法 # Create sample dfs set.seed(1) df1 <- data.frame("one" = sample(1:10,10,replace=TRUE), "two" = sample(1:10,10,replace=TRUE)) df2 <- data.frame("three" = sample(1:1

我想将char向量的各个元素作为列添加到data.frames列表中。我可以手动操作,但有没有更优雅的lapply方法

# Create sample dfs 
set.seed(1)
df1 <- data.frame("one" = sample(1:10,10,replace=TRUE),
                  "two" = sample(1:10,10,replace=TRUE))

df2 <- data.frame("three" = sample(1:10,10,replace=TRUE),
                  "four" = sample(1:10,10,replace=TRUE))

df3 <- data.frame("five" = sample(1:10,10,replace=TRUE),
                  "six" = sample(1:10,10,replace=TRUE))

# Combine them to list 
dflist = list("df1"=df1,"df2"=df2,"df3"=df3)

# add labelling column 
dflist$df1["label"] <- "a"
dflist$df2["label"] <- "b"
dflist$df3["label"] <- "c"

# With lapply I can only add either "a", "b" or "c" 
dflist = list("df1"=df1,"df2"=df2,"df3"=df3)
labvec <- c("a","b","c")
lapply(dflist,function(x) cbind(x,labvec[2])) # I have to select 1, 2 or 3.
不同的问题:我可以用lapply在labvec上建立索引吗

你可以使用地图

资料

你可以用地图

资料

使用lappy和dplyr::mutate的解决方案

请注意,这只是强制lappy,我的意思是,它基本上是一个for循环,没有那么好地隐藏。

一个使用lappy和dplyr::mutate的解决方案

请注意,这只是强制lappy,我的意思是,它基本上是一个for循环,隐藏得不太好。

使用tidyverse和map2

将tidyverse与map2一起使用


谢谢,这很有效,但我不明白为什么。不幸的是,Map的文档对我一点帮助都没有。@Kriselack很高兴它起了作用,是的,文档可能会更好,但你会在这里找到更多信息?mapply。Map应用了一个函数,在这里[这个例子我很容易理解,但是你的易于阅读的符号对我来说很难理解。你首先定义函数:在这里你创建data$label并给它赋值并返回新的数据….在你的第一个解决方案中你映射了函数[…我甚至不知道它的存在-这就是为什么我认为第二个符号更容易理解的原因。您可以通过帮助阅读文档[@Krisselack你不介意发现这很有用:谢谢,它很有效,但我不明白为什么。不幸的是,Map的文档对我一点帮助都没有。@Krisselack很高兴它有效,是的,文档可以更好,但你会在这里找到更多信息?mapply.Map在这里应用了一个函数[这个例子我很容易理解,但你的易于阅读的符号对我来说很难理解。你首先定义函数:在这里你创建data$label并给它赋值,然后返回新数据……在你的第一个解决方案中你映射了函数[…我甚至不知道它的存在-这就是为什么我认为第二个符号更容易理解的原因。您可以通过帮助阅读文档[@kriselack You mind]发现这很有帮助:
Map(`[<-`, x = dflist, i = "label", value = labvec)
#$df1
#  one two label
#1   1   3     a
#2   2   1     a
#3   2   3     a

#$df2
#  three four label
#1     3    1     b
#2     2    1     b
#3     2    1     b

#$df3
#  five six label
#1    3   2     c
#2    2   3     c
#3    3   3     c
Map(function(data, label, value) {data[label] <- value; data}, 
     data = dflist,
     label = "label",
     value = labvec) 
set.seed(1)
df1 <- data.frame("one" = sample(3,replace=TRUE),
                  "two" = sample(3,replace=TRUE))

df2 <- data.frame("three" = sample(3,replace=TRUE),
                  "four" = sample(3,replace=TRUE))

df3 <- data.frame("five" = sample(3,replace=TRUE),
                  "six" = sample(3,replace=TRUE))

# Combine them to list 
dflist = list("df1"=df1,"df2"=df2,"df3"=df3)
library(dplyr)

dflist <- lapply(1:length(dflist), function(i) {
  dflist[[i]] %>% 
    mutate(label = letters[i])
})
# lapply(dflist, head, 2)
# [[1]]
#   one two label
# 1   3   3     a
# 2   4   2     a
# 
# [[2]]
#   three four label
# 1    10    5     b
# 2     3    6     b
# 
# [[3]]
#   five six label
# 1    9   5     c
# 2    7   9     c
library(tidyverse)
map2(dflist, labvec, ~ .x %>% 
                      mutate(label = .y))
#$df1
#   one two label
#1    3   3     a
#2    4   2     a
#3    6   7     a
#4   10   4     a
#5    3   8     a
#6    9   5     a
#7   10   8     a
#8    7  10     a
#9    7   4     a
#10   1   8     a

#$df2
#   three four label
#1     10    5     b
#2      3    6     b
#3      7    5     b
#4      2    2     b
#5      3    9     b
#6      4    7     b
#7      1    8     b
#8      4    2     b
#9      9    8     b
#10     4    5     b

#$df3
#   five six label
#1     9   5     c
#2     7   9     c
#3     8   5     c
#4     6   3     c
#5     6   1     c
#6     8   1     c
#7     1   4     c
#8     5   6     c
#9     8   7     c
#10    7   5     c