在R中将列表与向量合并

6

我有一些类似以下的数据:

num = list()
num[[1]] = c(1,2,3)
num[[2]] = c(4,5,6,7)
name = c("Alex", "Patrick")

我该如何将它组合成一个类似于这样的数据框呢?
Alex        1
Alex        2
Alex        3
Patrick     4
Patrick     5
Patrick     6
Patrick     7

非常抱歉会提出一个显然的问题。我进行了广泛的搜索,但没有找到答案,可能是因为我不知道如何清楚地描述这个查询。


3
stack(setNames(num, name)) - user20650
@user20650 把它作为答案添加,新的每日函数 - 栈! - zx8754
2
@zx8754; 哈,是的,我很少记得它。但我想我会让它在评论中闲逛,因为它实际上只是像Richard S的答案一样,只是穿着衣服。 - user20650
1
@user20650 太棒了 - Alex Lach
3个回答

8

试一试。新的lengths()函数在这里非常方便。

data.frame(name = rep(name, lengths(num)), num = unlist(num))
#      name num
# 1    Alex   1
# 2    Alex   2
# 3    Alex   3
# 4 Patrick   4
# 5 Patrick   5
# 6 Patrick   6
# 7 Patrick   7

为了更好地理解,让我们从内部向外部分解一下。 lengths() 告诉我们列表中每个元素的长度,因此我们有:
lengths(num)
# [1] 3 4

现在我们将其作为rep()中的times参数来复制name的元素。
rep(name, lengths(num))
# [1] "Alex"    "Alex"    "Alex"    "Patrick" "Patrick" "Patrick" "Patrick"

所以这是第一栏。对于第二栏,我们只需使用 unlist()num 转换为原子向量即可。
unlist(num)
# [1] 1 2 3 4 5 6 7

将它们按照上面所示的方式组合起来,我们就得到了您的新数据框。

这太棒了。嵌套函数有点难理解,但我想我懂了。谢谢。 - Alex Lach
1
@AlexLach - 我添加了一些解释。希望能有所帮助。 - Rich Scriven

3

另一个选项:

data.table::rbindlist(Map(function(x,y) data.frame(name = x, num = y), name, num))
      name num
1:    Alex   1
2:    Alex   2
3:    Alex   3
4: Patrick   4
5: Patrick   5
6: Patrick   6
7: Patrick   7

2

或者我们可以在将“num”与“name”设置为名称后,使用stack

stack(setNames(num, name))[2:1]
#      ind values
#1    Alex      1
#2    Alex      2
#3    Alex      3
#4 Patrick      4
#5 Patrick      5
#6 Patrick      6
#7 Patrick      7

刚刚注意到@user20650在评论中发布了这个。在这种情况下,我们也可以执行以下操作:

library(reshape2)
melt(setNames(num, name))[2:1]
#       L1 value
#1    Alex     1
#2    Alex     2
#3    Alex     3
#4 Patrick     4
#5 Patrick     5
#6 Patrick     6
#7 Patrick     7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接