我想将数据框转换为列表。 参见表1中的输入。 参见表2中的输出。 当您从环境中在R中打开列表时。 名称-以下名称为clus1,clus2 ... 类型-应包含第V1列中的值 值-长度为3的列表
Table 1
V1 V2 V3
clus1 10 a d
clus2 20 b e
clus3 5 c f
Table 2
$`clus1`
[1] "a" "d"
$`clus2`
[2] "b" "e"
$`clus3`
[2] "c" "f"
答案 0 :(得分:7)
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"
在这种情况下,如果我们先转换为矩阵,我们可以直接进行一些操作:
r2 = split(as.matrix(t1[, 2:3]), f = row.names(t1))
r2 = lapply(r2, function(x) x[x != ''])
# same result
答案 1 :(得分:2)
您可能会认为这是一项重塑任务,以便针对多个列进行缩放,即创建一列值,而不是跟踪使用V2
和V3
列的整个过程。这样,您就可以通过一些基本的dydyverse函数来一次完成该操作。这样一来,您就可以在删除列表或其他条件的基础上轻松地在创建列表之前过滤数据,而无需指定列。
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"