【发布时间】:2018-08-09 19:39:27
【问题描述】:
我有一个这样的数据框
id key value
1 x a 1
2 x b 2
3 y a 3
4 y b 4
read.table(text = "id key value
x a 1
x b 2
y a 3
y b 4", header = TRUE, sep = "\t")
我想获得每个id 的列表以及每个key 的子列表
所以在我的例子中,预期的输出是:
$x
$x$a
$x$a$value
[1] 1
$x$b
$x$b$value
[1] 2
$y
$y$a
$y$a$value
[1] 3
$y$b
$y$b$value
[1] 4
list(
x = list(
a = list(value = 1),
b = list(value = 2)
),
y = list(
a = list(value = 3),
b = list(value = 4)
)
)
我可以通过嵌套的lapply 和split 来实现它,但我认为应该有更直接的方法来实现它。
任何帮助将不胜感激。
【问题讨论】:
-
一般来说,您可以使用递归的
split/lapply来解决这个问题。例如。 (至少在这里):ff = function(x) if(is.data.frame(x)) lapply(split(x[, -1], x[[1]]), ff) else x; ff(dat); ff(cbind(dat[1:2], "value", dat[3]))似乎有效 -
感谢您的提示,它证实了我肯定应该有一个不错的
purrr解决方案 -
如果我有一个附加列
value2应该与value处于同一列表级别,你会怎么做:例如list(x = list(a = list(value1 = 1, value2 = 2))) -
您可以尝试将要递归的列数指定为参数:
ff = function(x, nrec) if(nrec) lapply(split(x[-1], x[[1]]), ff, nrec - 1L) else as.list(x); ff(dat, 2); dat2 = cbind(dat, value2 = c(10, 20, 30, 40)); ff(dat2, 2)。我不确定这可以推广到什么程度
标签: r