根据列

时间:2018-03-12 09:36:00

标签: r

当value = 1且sum columns values = 1时,建议选择行的列。这意味着我只会选择与其他人不共享的唯一值。

indv. X Y Z W T J
A     1 0 1 0 0 1
B     0 1 1 0 0 0
C     0 0 1 1 0 0
D     0 0 1 0 1 0

A: X, J
B: Y
C: W
D: T

3 个答案:

答案 0 :(得分:3)

一个想法是使用rowwise apply来查找带有1的列,在我们用sum!= 1过滤掉列,即

apply(df[colSums(df) == 1], 1, function(i) names(df[colSums(df) == 1])[i == 1])

$A
[1] "X" "J"

$B
[1] "Y"

$C
[1] "W"

$D
[1] "T"

您可以使用输出来使其达到所需状态,即

apply(df[colSums(df) == 1], 1, function(i) toString(names(df[colSums(df) == 1])[i == 1]))
#     A      B      C      D 
#"X, J"    "Y"    "W"    "T" 

或者

data.frame(cols = apply(df[colSums(df) == 1], 1, function(i) toString(names(df[colSums(df) == 1])[i == 1])))

#  cols
#A X, J
#B    Y
#C    W
#D    T

答案 1 :(得分:2)

你走了!基础r的解决方案。 首先,我们模拟您的数据,一个带有命名行和列的data.frame。

您可以使用sapply()循环列索引。 列索引上的for循环将实现相同的目的。

最后,根据需要将结果保存在data.frame中。

# Simulate your example data
df <- data.frame(matrix(c(1, 0, 1, 0, 0, 1,
                          0, 1, 1, 0, 0, 0,
                          0, 0, 1, 1, 0, 0,
                          0, 0, 1, 0, 1, 0), nrow = 4, byrow = T))


# Names rows and columns accordingly
names(df) <- c("X", "Y", "Z", "W", "T", "J")
rownames(df) <- c("A", "B","C", "D")

> df
  X Y Z W T J
A 1 0 1 0 0 1
B 0 1 1 0 0 0
C 0 0 1 1 0 0
D 0 0 1 0 1 0

然后我们选择具有唯一值的sum == 1-列的列。 对于这些列中的每一列,我们都会找到此值的行。

# Select columns with unique values (if sum of column == 1)
unique.cols <- which(colSums(df) == 1)
# For every one of these columns, select the row where row-value==1
unique.rows <- sapply(unique.cols, function(x) which(df[, x] == 1))

> unique.cols
X Y W T J 
1 2 4 5 6 

> unique.rows
X Y W T J 
1 2 3 4 1

行尚未正确命名(它们仍然是名为unique.cols的元素)。因此,我们引用df的rownames来获取rownames。

# Data.frame of unique values
#   Rows and columns in separate columns
df.unique <- data.frame(Cols = unique.cols,
                    Rows = unique.rows,
                    Colnames = names(unique.cols),
                    Rownames = rownames(df)[unique.rows],
                    row.names = NULL)

结果:

df.unique
  Cols Rows Colnames Rownames
1    1    1        X        A
2    2    2        Y        B
3    4    3        W        C
4    5    4        T        D
5    6    1        J        A

编辑:

这是使用dplyr汇总每行值的方法。

library(dplyr)

df.unique %>% group_by(Rownames) %>%
  summarise(paste(Colnames, collapse=", "))




   # A tibble: 4 x 2
  Rownames `paste(Colnames, collapse = ", ")`
  <fct>    <chr>                             
1 A        X, J                              
2 B        Y                                 
3 C        W                                 
4 D        T  

答案 2 :(得分:1)

以下是tidyverse的选项。我们gather数据集为'long'格式,按'key'分组,fiter'val'为1的行和'val的sum为1,按'indv'分组。{,summarise paste元素组合在一起的'key'

library(dplyr)
library(tidyr)
gather(df1, key, val, -indv.) %>%         
     group_by(key) %>% 
     filter(sum(val) == 1, val == 1) %>%
     group_by(indv.) %>% 
     summarise(key = toString(key))
# A tibble: 4 x 2
#   indv. key  
#   <chr> <chr>
#1 A     X, J 
#2 B     Y    
#3 C     W    
#4 D     T