R 通过Lappy向数据帧列表添加不同的字符
我想将char向量的各个元素作为列添加到data.frames列表中。我可以手动操作,但有没有更优雅的lapply方法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
# 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