Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据标签创建数据帧分组观测值_R - Fatal编程技术网

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