【问题标题】:R: Aggregating a list of column names mapped to row numbers based off of a condition in a data frameR:根据数据框中的条件聚合映射到行号的列名列表
【发布时间】:2017-04-21 18:00:03
【问题描述】:

按比例缩小我的数据框如下所示:

+---+------------+-------------+
|   |   Label1   |   Label2    |
+---+------------+-------------+
| 1 |      T     |     F       |
| 2 |      F     |     F       |
| 3 |      T     |     T       |
+---+------------+-------------+

我需要创建一个列表列表,将列名映射到所有以 false 布尔值作为其值的行号。对于上面的示例,它看起来像这样:

{"Label1" : (2), "Label2" : (1,2)}

我目前正在这样做:

myList = with(data.frame(which(!myDataFrame, arr.ind = TRUE)), list("colNames" = names(myDataFrame)[col], "rows" = row))

l = list()
count = 1;
for (i in myList[["colNames"]]) {
  tmpRowNum = myList[["rows"]][[count]];
  tmpList = l[[i]];
  if (is.null(tmpList)) {
    tmpList = list();
  }
  l[[i]] = c(tmpList, list(tmpRowNum))
  count = count + 1;
}

这确实有效,但由于我是 R 新手,我只能假设有一种更有效的方法可以做到这一点。 with 函数创建了两个单独的列表,我必须将它们组合起来才能得到我正在寻找的结果。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以试试:

    df <- data.frame(Label1=c("T","F","T"),Label2=c("F","F","T"))
    
    lapply(df,function(x) which(x=="F"))
    
    $Label1
    [1] 2
    
    $Label2
    [1] 1 2
    

    编辑要逐行获得相同的结果,请使用 apply 和 margin=1:

    apply(df,1,function(x) which(x=="F"))
    

    获取第 2 行中“F”的向量:

    res <- apply(df,1,function(x) which(x=="F"))
    res[[2]]
     1      2 
    

    【讨论】:

    • 有没有可能反其道而行之?将行号映射到它具有错误值的列名列表?
    【解决方案2】:

    获取行/列索引的一种有用方法是使用whicharr.ind

    i1 <- which(df=="F", arr.ind=TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2023-01-10
      • 2016-10-02
      相关资源
      最近更新 更多