【问题标题】:How to aggregate multiple columns into one depending on colums values? [duplicate]如何根据列值将多列聚合为一列? [复制]
【发布时间】:2018-07-28 03:16:10
【问题描述】:

我想使用该值将一些列聚合为一个。

我有一个这样的矩阵:

| X  | Y1 | Y2 | Y3 | Y4 |
|----|----|----|----|----|
|id1 | 0  | 0  | 1  | 0  |
|id2 | 0  | 1  | 0  | 0  |
|id3 | 0  | 1  | 0  | 0  |
|id4 | 0  | 0  | 0  | 1  |
|id5 | 0  | 1  | 0  | 0  |
|id6 | 1  | 0  | 0  | 0  |

我想检索这样的矩阵:

| X  | Y  |
|----|----|
|id1 | Y3 |
|id2 | Y2 |
|id3 | Y2 |
|id4 | Y4 |
|id5 | Y2 |
|id6 | Y1 |

我不知道我该怎么做。

感谢您的帮助。

【问题讨论】:

标签: r


【解决方案1】:

这是一个使用基础 R 中的max.col 的矢量化方法,

names(df)[max.col(df[-1])+1]
#[1] "Y3" "Y2" "Y2" "Y4" "Y2" "Y1"

要构造你的输出,你可以简单地使用data.frame

data.frame(X = df$X, Y = names(df)[max.col(df[-1])+1])

给出,

    X  Y
1 id1 Y3
2 id2 Y2
3 id3 Y2
4 id4 Y4
5 id5 Y2
6 id6 Y1

max.col 的更简化版本,因为它也适用于逻辑语句,可以是(@Jaap 的赞美)

names(df)[max.col(df == 1)]

【讨论】:

  • 即将发布相同的内容:-)
  • @Jaap heh...我在用stack 做某事,然后max.col 打我)
  • 我有一个稍微不同的选择:names(df)[max.col(df == 1)]
  • 不知道max.col 存在,这是一个很好的解决方案。
【解决方案2】:

tidyrdplyr 的一种方式:

library(dplyr)
library(tidyr)

df %>% 
  gather(key, value, -X) %>% 
  filter(value == 1) %>% 
  arrange(X)

返回:

# A tibble: 6 x 3
  X     key   value
  <chr> <chr> <chr>
1 id1   Y3    1    
2 id2   Y2    1    
3 id3   Y2    1    
4 id4   Y4    1    
5 id5   Y2    1    
6 id6   Y1    1   

数据:

df <- data.frame(stringsAsFactors=FALSE,
                 X = c( "id1", "id2", "id3", "id4", "id5", "id6"),
                 Y1 = c( "0", "0", "0", "0", "0", "1"),
                 Y2 = c("0", "1", "1", "0", "1", "0"),
                 Y3 = c("1", "0", "0", "0", "0", "0"),
                 Y4 = c("0", "0", "0", "1", "0", "0"))

【讨论】:

    【解决方案3】:

    这是base R 解决方案。我使用以下data.frame 进行说明

    df <- data.frame(X = c("id1", "id2", "id3", "id4"),
                     Y1 = c(1, 0, 0, 0),
                     Y2 = c(0, 1, 0, 1),
                     Y3 = c(0, 0, 1, 0))
    df
    #    X Y1 Y2 Y3
    #1 id1  1  0  0
    #2 id2  0  1  0
    #3 id3  0  0  1
    #4 id4  0  1  0
    

    在第一步中,对于每一行,我将查找包含值 1 的列的位置。

    col_positions <- sapply(X = 1:nrow(df), FUN = function(x) which(df[x, ] == 1))
    col_positions
    #[1] 2 3 4 3
    

    现在您可以使用此向量过滤 colnames(df) 并将结果附加到您的数据中。

    df$Y <- colnames(df)[col_positions]
    df
    #    X Y1 Y2 Y3  Y
    #1 id1  1  0  0 Y1
    #2 id2  0  1  0 Y2
    #3 id3  0  0  1 Y3
    #4 id4  0  1  0 Y2
    

    如果您只想保留列XY,您可以选择它们,例如如下所示

    df[, colnames(df) %in% c("X", "Y")]
    

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多