如何转换data.frame
df <- data.frame(id=c("af1", "af2"), start=c(100, 115), end=c(114,121))
Run Code Online (Sandbox Code Playgroud)
到列表列表
LoL <- list(list(id="af1", start=100, end=114), list(id="af2", start=115, end=121))
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西
not.LoL <- as.list(as.data.frame(t(df)))
Run Code Online (Sandbox Code Playgroud)
而且我真的不确定在此之后我最终会得到什么,但这不太对劲.我的要求是我可以start通过命令访问第一个
> LoL[[1]]$start
[1] 100
Run Code Online (Sandbox Code Playgroud)
在not.LoL我目前有给我以下错误:
> not.LoL[[1]]$start
Error in not.LoL[[1]]$start : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud)
非常感谢解释和/或解决方案.
编辑:我应该清楚地说明这里的"id"实际上是非唯一的 - 在一个ID下可以有多个元素.所以我可以使用不依赖于唯一ID的解决方案split.
使用plyr,你可以这样做
dlply(df,.(id),c)
Run Code Online (Sandbox Code Playgroud)
为避免按ID分组,如果有多个(可能需要更改列名,id对我来说是唯一的)
dlply(df,1,c)
Run Code Online (Sandbox Code Playgroud)
LMAo <- lapply(split(df,df$id), function(x) as.list(x)) # is one way
# more succinctly
# LMAo <- lapply(split(df,df$id), as.list)
Run Code Online (Sandbox Code Playgroud)
根据您的评论编辑的解决方案:
lapply( split(df,seq_along(df[,1])), as.list)
Run Code Online (Sandbox Code Playgroud)
您可以使用apply将数据框转换为列表列表,如下所示:
LoL <- apply(df,1,as.list)
Run Code Online (Sandbox Code Playgroud)
但是,这会将所有数据更改为文本,因为它将单个原子向量传递给函数.