gpt4 book ai didi

list - 列表中的数据框;添加一个名为数据框的新变量

转载 作者:行者123 更新时间:2023-12-03 19:58:28 28 4
gpt4 key购买 nike

我有一个数据框列表,我最终想要合并这些数据框,同时保留其原始数据框名称或列表索引的记录。这将允许我对所有行进行子集等。为了实现这一点,我想向每个数据帧添加一个新变量“id”,其中包含它所属的数据帧的名称/索引。

编辑:“在我的真实代码中,数据帧变量是通过使用以下代码读取多个文件而创建的,因此我没有实际名称,只有 'files.to.read' 列表中的名称,我不确定它们是否会对齐使用数据框顺序:

mylist <- llply(files.to.read, read.csv)

在几篇文章中强调了一些方法:
Working-with-dataframes-in-a-list-drop-variables-add-new-ones
Using-lapply-with-changing-arguments

我尝试了两种类似的方法,第一种使用索引列表:
df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1,df2)

# Adds a new coloumn 'id' with a value of 5 to every row in every dataframe.
# I WANT to change the value based on the list index.
mylist1 <- lapply(mylist,
function(x){
x$id <- 5
return (x)
}
)
#Example of what I WANT, instead of '5'.
#> mylist1
#[[1]]
#x y id
#1 1 11 1
#2 2 12 1
#3 3 13 1
#4 4 14 1
#5 5 15 1
#
#[[2]]
#x y id
#1 1 11 2
#2 2 12 2
#3 3 13 2
#4 4 14 2
#5 5 15 2

第二次尝试传递列表的名称()。
# I WANT it to add a new coloumn 'id' with the name of the respective dataframe
# to every row in every dataframe.
mylist2 <- lapply(names(mylist),
function(x){
portfolio.results[[x]]$id <- "dataframe name here"
return (portfolio.results[[x]])
}
)
#Example of what I WANT, instead of 'dataframe name here'.
# mylist2
#[[1]]
#x y id
#1 1 11 df1
#2 2 12 df1
#3 3 13 df1
#4 4 14 df1
#5 5 15 df1
#
#[[2]]
#x y id
#1 1 11 df2
#2 2 12 df2
#3 3 13 df2
#4 4 14 df2
#5 5 15 df2

但是 names() 函数不适用于数据框列表;它返回NULL。
我可以在第一个示例中使用 seq_along(mylist) 吗?

处理整个“与源 ID 合并”的任何想法或更好的方法

编辑 - 在下面添加了解决方案:我已经使用 Hadleys 的建议和 Tommy 的轻推实现了一个解决方案,看起来像这样。
files.to.read <- list.files(datafolder, pattern="\\_D.csv$", full.names=FALSE)
mylist <- llply(files.to.read, read.csv)
all <- do.call("rbind", mylist)
all$id <- rep(files.to.read, sapply(mylist, nrow))

我使用 files.to.read 向量作为每个数据帧的 id

我也改变了使用 merge_recurse() 的方式,因为它由于某种原因非常慢。
 all <- merge_recurse(mylist)

谢谢大家。

最佳答案

就个人而言,我认为在折叠后添加名称更容易:

df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1 = df1, df2 = df2)

all <- do.call("rbind", mylist)
all$id <- rep(names(mylist), sapply(mylist, nrow))

关于list - 列表中的数据框;添加一个名为数据框的新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7073785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com