使用与数据框中的唯一值关联的值

时间:2010-10-15 19:12:48

标签: r

我有一个类似于此的数据框 - 例如,2列和多行:

A 2

A 7

B 1

B 3

B 6

C 2

我想对第1列的每个唯一值中的第二列中的项目执行一些操作。

我有

  unique.values <- sort(unique(mydata[,1])) 

这部分适用于获取每个唯一值,但我不知道如何将每个唯一因子与第二列中的值相关联。我需要能够完全独立地对每一个进行操作,并希望能够计算行等。尝试使用grep,但无法使其工作。

感谢您提供任何帮助!

3 个答案:

答案 0 :(得分:2)

不完全听从你的问题,但我认为这就是你想要的:

df <- data.frame(read.table(textConnection("
A 2
A 7
B 1
B 3
B 6
C 2")))
library(plyr)
ddply(df, .(V1), nrow)

有很多方法可以做这种事情,所以如果你想要更好的答案,你需要提供更多有关你想要做的事情的细节。

修改

通常,如果您有一组唯一值,并且希望根据该集合对它们应用函数,则可以使用某个版本的apply函数执行此操作。例如,在上面的示例中,以下是基于第一列获取平均值的几种不同方法:

ddply(df, .(V1), function(x) data.frame(mean=mean(x[,2])))
do.call("rbind", by(df, df[,1], function(x) data.frame(mean=mean(x[,2]))))
do.call("rbind", lapply(unique(df[,1]), function(a) data.frame(V1=a, mean=mean(df[df[,1]==a,2]))))

答案 1 :(得分:2)

ave()函数或tapply函数将执行您想要的操作。这取决于你想要的输出。如果希望输出向量与输入向量ave()一样长,但是如果要将数据减少到分组向量tapply()的级别。

ave(mydata[,2], mydata[,1], FUN = length) #FUN can be any function

或者,对于简化版......

tapply(mydata[,2], mydata[,1], FUN = length) #FUN can be any function

答案 2 :(得分:0)

另一种可能性,使用Shane的df

aggregate(df[,2],list(df[,1]),FUN=length) 

再次,将length替换为适用于矢量的任何其他函数。您可以在list中指定多个因子,然后针对每个因子组合执行此操作。

ave()的区别在于ave()给出了一个具有原始数据帧长度的向量。 aggregate()返回一个数据框,其中一个变量是组指示符。 tapply()返回一个长度等于组数的向量。 ddply()返回一个数据框,其中包含每个指定因子的变量。

如果您必须对多个列执行操作,by()构造特别有用,因为它基本上是数据帧上的循环。它返回一个列表,可以使用Shanes构造转换,也可以直接使用matrix()rbind()。这给每次一个不同的结构,但它们都很有用。

根据您希望输出的格式,您可以选择其中一种可能性。