【问题标题】:Using values associated with unique values from a data frame使用与数据框中的唯一值关联的值
【发布时间】:2010-10-15 19:12:47
【问题描述】:

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

一个 2

一个7

B 1

B 3

B 6

C 2

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

我有

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

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

感谢您提供的任何帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    不完全遵循您的问题,但我认为这就是您想要的:

    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]))))
    

    【讨论】:

    • 抱歉含糊其辞。我已经在一个名为“mydata”的数据框中拥有所有这些值,因此该部分工作正常。评论中的一个是可视化的示例。新的 unique.values 包含来自第 1 列的每个唯一值。我要做的是获取与 col 1 的单个值相关联的 col 2 的每个值,并将它们分开以便做事给他们。例如,对于第 1 列中的值 B,我希望能够对第 2 列中的相应值进行一些数学运算:1、3 和 6。这更清楚吗?我将开始使用你给我的东西,谢谢!
    • 是的,只需将nrow 替换为您想要的任何功能,它就会按照您的描述进行操作。
    • do.call 反射又来了? ;-)
    • @Joris 在不使用包的情况下,对于如何将列表转换为矩阵有更好的建议吗?
    • cbind(by(df, df[,1], function(x) mean(x[,2]))) (与第一个选项相同),或聚合(df[, 2],list(df[,1]),FUN=mean) (用于第二个选项)
    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-09
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        相关资源
        最近更新 更多