首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据帧转换为R中的列表

将数据帧转换为R中的列表
EN

Stack Overflow用户
提问于 2019-10-29 22:32:40
回答 2查看 102关注 0票数 3

我想要将数据帧转换为列表。参见表1中的输入。当您从环境中打开R中的列表时,参见表2中的输出。名称-以下名称clus1,clus2...类型-应包含列V1值中的值-长度为3的列表

代码语言:javascript
复制
Table 1
      V1 V2 V3
clus1 10 a  d
clus2 20 b  e
clus3 5  c  f
代码语言:javascript
复制
Table 2
$`clus1`
[1] "a"  "d" 

$`clus2`
[2] "b"  "e" 

$`clus3`
[2] "c"  "f"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-29 22:36:23

代码语言:javascript
复制
t1 = read.table(text = "      V1 V2 V3
clus1 10 a  d
clus2 20 b  e
clus3 5  c  ''", header = T)

result = split(t1[, 2:3], f = row.names(t1))
result = lapply(result, function(x) {
  x = as.character(unname(unlist(x)))
  x[x != '']})
result
# $clus1
# [1] "a" "d"
# 
# $clus2
# [1] "b" "e"
# 
# $clus3
# [1] "c"

在这种特殊情况下,如果我们首先转换为矩阵,我们可以更直接地进行:

代码语言:javascript
复制
r2 = split(as.matrix(t1[, 2:3]), f = row.names(t1))
r2 = lapply(r2, function(x) x[x != ''])
# same result
票数 7
EN

Stack Overflow用户

发布于 2019-10-29 23:20:19

您可能会认为这是一项重塑任务,以便将其扩展到多个列,即创建一列值,而不是跟踪您正在处理的列V2V3。这样,您就可以使用一些基本的tidyverse函数一次性完成此操作。这还允许您在创建列表之前,根据删除空白或任何其他条件轻松过滤数据,同样不需要指定列。

代码语言:javascript
复制
library(dplyr)

# thanks @Gregor for filling in the data
tibble::rownames_to_column(t1, var = "clust") %>%
  select(-V1) %>%
  tidyr::gather(key, value, -clust) %>%
  filter(value != "") %>%
  split(.$clust) %>%
  purrr::map("value")
#> $clus1
#> [1] "a" "d"
#> 
#> $clus2
#> [1] "b" "e"
#> 
#> $clus3
#> [1] "c"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58609549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档