如何在列表

时间:2018-03-01 18:07:16

标签: r lapply paste

我无法结合使用lapply和paste来组合列表中包含的多个数据帧的两列。我看了很多来源,但找不到答案。

这个答案 Apply paste over a list of vectors to get a list of strings是关于组合列表中的行,而不是组合列来获取向量。

此答案解释了如何选择列但不将它们粘贴在一起using lapply on a list of dataframes

此页面介绍了如何访问列表中的列,而不是如何将它们组合在一起https://www.datacamp.com/community/tutorials/r-tutorial-apply-family

这个答案是最接近的,但我不能对文字Performing an operation on multiple columns in a list of data

使用转换

下面的代码是成功创建输出的示例,但不使用lapply。我将在许多不同的数据帧上应用此功能,因此需要使用lapply。据推测,我可以使用for i循环,但是lapply可能更干净。我需要使用lapply而不是sapply,因为数据帧将具有不同的长度。

我想用一个lapply函数替换启动output1,output2和output的三行,这个函数在本例中适用于两个数据帧。我认为它应该像

output <-lapply(mylist, paste($Artist,$Song))

但这不起作用。提前谢谢。

Artist <- c("Drake", "Ed Sheeran", "Bruno Mars", "Camilla Cabello", "BlocBoy")    
Song <- c("Gods Plan", "Perfect", "Finesse", "Havana", "Look Alive")
Current <- data.frame(cbind(Artist,Song))
Artist <- c("Gucci Mane", "Migos", "Daft Punk", "Chainsmokers")
Song <- c("Black Beatles", "Bad and Boujee", "Starboy", "Closer")
Past <- data.frame(cbind(Artist,Song))

mylist <- list(Current,Past)

output1  <- paste(mylist[[1]]$Artist,mylist[[1]]$Song)
output2  <- paste(mylist[[2]]$Artist,mylist[[2]]$Song)
output <-list(output1,output2)
print(output)

2 个答案:

答案 0 :(得分:3)

我认为这就是你的目标:

lapply(mylist, function(x) paste(x$Artist, x$Song, sep=" "))

我们只需要定义一个小的匿名函数来连接列。

[[1]]
[1] "Drake Gods Plan"        "Ed Sheeran Perfect"     "Bruno Mars Finesse"    
[4] "Camilla Cabello Havana" "BlocBoy Look Alive"    

[[2]]
[1] "Gucci Mane Black Beatles" "Migos Bad and Boujee"    
[3] "Daft Punk Starboy"        "Chainsmokers Closer" 

答案 1 :(得分:1)

使用purrr::map

tidyverse的解决方案
library(tidyverse)

map(list(Current, Past), ~ paste(.$Artist, .$Song))

[[1]]
[1] "Drake Gods Plan"        "Ed Sheeran Perfect"     "Bruno Mars Finesse"    
[4] "Camilla Cabello Havana" "BlocBoy Look Alive"    

[[2]]
[1] "Gucci Mane Black Beatles" "Migos Bad and Boujee"     "Daft Punk Starboy"       
[4] "Chainsmokers Closer"