R 根据标签创建数据帧分组观测值
我有一个带有分类变量的R 根据标签创建数据帧分组观测值,r,R,我有一个带有分类变量的x向量和一个数值变量的y向量,两者长度相同。 我需要创建一个数据框,在该数据框中,y中的所有数值观测值通过x中的分类标签分为若干组,因此最终结果如下所示: x obs1 obs2 obs3 a 1 3 5 b 6 7 8 c 3 4 6 现在,aggregate和tapply都需要FUN规范,但我不想对变量进行操作 x={从字母表的字母中随机抽样} y={random numbers}记住,一切都是R中的函数。所以像c()这样的东西只是
x
向量和一个数值变量的y
向量,两者长度相同。
我需要创建一个数据框,在该数据框中,y
中的所有数值观测值通过x
中的分类标签分为若干组,因此最终结果如下所示:
x obs1 obs2 obs3
a 1 3 5
b 6 7 8
c 3 4 6
现在,aggregate
和tapply
都需要FUN
规范,但我不想对变量进行操作
x={从字母表的字母中随机抽样}
y={random numbers}记住,一切都是R中的函数。所以像
c()
这样的东西只是函数调用
x <- rep(letters[1:3], each=3)
y <- c(1, 3, 5, 6, 7, 8, 3, 4, 6)
foo <- tapply(y, x, c)
# > foo
# $a
# [1] 1 3 5
# $b
# [1] 6 7 8
# $c
# [1] 3 4 6
从你的例子中我不清楚:x中的每个类别是否可能有不同数量的y值?例如,你会考虑这样的基本数据:
> x <- c(rep(c("a", "b", "c"), 3), "c", "c")
> y <- sample(1:20, 11)
> df <- data.frame(x, y)
> df
x y
1 a 16
2 b 4
3 c 9
4 a 2
5 b 12
6 c 17
7 a 7
8 b 10
9 c 11
10 c 1
11 c 8
每个类别的值显示在右侧的行中。。。但是NAs是一个讨厌的东西。在这种情况下,您希望数据如何显示?差不多
1 a 2 7 16
2 b 4 10 12
3 c 1 8 9 11 17
当然,这是行不通的,因为每一行必须有相同数量的列,所以最后两行中的最后两个元素将使用NAs
然而,我怀疑在这种情况下,一个列表可能是最好的解决方案,在这种情况下,考虑如下:
> dl <- split(y, x)
> dl[["a"]]
[1] 16 2 7
> dl$b
[1] 4 12 10
> dl[["c"]]
[1] 9 17 11 1 8
或者将输出作为向量
> sapply(dl, sum)
a b c
25 26 46
或者,作为数据帧获取输出:
> library(plyr)
> ldply(dl, sum)
.id V1
1 a 25
2 b 26
3 c 46
这些机制提供了比rowSum()等函数更大程度的通用性,因为您可以将基本上任意的函数应用于原始列表中的每个元素。请包括您所指的初始
x
和y
。
> lapply(dl, sum)
$a
[1] 25
$b
[1] 26
$c
[1] 46
> sapply(dl, sum)
a b c
25 26 46
> library(plyr)
> ldply(dl, sum)
.id V1
1 a 25
2 b 26
3 c 46