【问题标题】:How to select rows from data.frame with 2 conditions如何从具有 2 个条件的 data.frame 中选择行
【发布时间】:2010-12-04 22:16:57
【问题描述】:

我有一个汇总表:

> aggdata[1:4,]
  Group.1 Group.2         x
1       4    0.05 0.9214660
2       6    0.05 0.9315789
3       8    0.05 0.9526316
4      10    0.05 0.9684211

当我有 Group.1 和 Group.2 的值时,如何选择 x 值?

我试过了:

aggdata[aggdata[,"Group.1"]==l && aggdata[,"Group.2"]==lamda,"x"]

但这会回复所有的 x。

更多信息: 我想这样使用:

table = data.frame();
for(l in unique(aggdata[,"Group.1"])) {
    for(lambda in unique(aggdata[,"Group.2"])) {
        table[l,lambda] = aggdata[aggdata[,"Group.1"]==l & aggdata[,"Group.2"]==lambda,"x"]
    }
}

任何更容易并给出这个结果的建议我都很感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    有一个关于子集 R 数据框的非常有用的文档: http://www.ats.ucla.edu/stat/r/modules/subsetting.htm

    以下是相关摘录:

    使用多个子集的行 条件语句:没有 限制多少逻辑语句 可以结合起来实现 所需的子集。数据 框架 x.sub1 仅包含 观察值 变量 y 大于 2 并且 变量 V1 更大 大于 0.6。

    x.sub1 <- subset(x.df, y > 2 & V1 > 0.6)

    【讨论】:

    【解决方案2】:

    最简单的解决方案是将代码中的“&&”更改为“&”。

    > aggdata[aggdata[,"Group.1"]==6 & aggdata[,"Group.2"]==0.05,"x"]
    [1] 0.9315789
    

    我首选的解决方案是使用子集():

    > subset(aggdata, Group.1==6 & Group.2==0.05)$x
    [1] 0.9315789
    

    【讨论】:

    • 为什么更喜欢子集?只是因为它更整洁一点?
    • @naught101 是的,只是因为它更简单并且不会不必要地重复任何元素。
    【解决方案3】:

    使用 & 而不是 &&。后者只计算每个向量的第一个元素。

    更新:回答第二部分,使用 reshape 包。这样的事情会做到:

    tablex <- recast(aggdata, Group.1 ~ variable * Group.2, id.var=1:2)
    # Now add useful column and row names
    colnames(tablex) <- gsub("x_","",colnames(tablex))
    rownames(tablex) <- tablex[,1]
    # Finally remove the redundant first column
    tablex <- tablex[,-1]
    

    有更多使用 reshape 经验的人可能有更简单的解决方案。

    注意:不要使用 table 作为变量名,因为它与 table() 函数冲突。

    【讨论】:

    • 谢谢!似乎确实选择了 1 个元素。然而,现在我的循环给出了错误:“x[[jj]]
    • 产生该错误是因为您在 lambda 小于 1 时使用 table[l,lambda]。
    • 我无法弄清楚您要做什么,因为组元素不是唯一的。
    • 我在 L 和 lambda 上聚合了一个表,取某个值的平均值(聚合命令)。因此,在表中,Group.1 和 Group.2 的每个组合都有一个唯一值。我想构建一个具有两个维度 Group.1 和 Group.2 的表/矩阵
    猜你喜欢
    • 2022-01-26
    • 2020-02-03
    • 2022-07-05
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多