有没有办法要求行值在 R 中相互对应?

Is there a way to require row values to correspond with eachother in R?

所以我的问题听起来不太正确,但我不知道如何更正确地表达它。

我正在尝试执行以下操作。我有一个包含 3 列的数据框,其中 2 列可以有 1(是)或 2(否)。还有 1 列有 1,2 或 3。现在我想做的是查看哪个百分比在 1 上有所有 2 列,在 1 或 2 上有 1 列,它在 2 上有所有 2 列,在 1 上有一个列3,并且只有 1 上的 2 列之一和 1 或 2 上的一列。

如果你明白我的意思?

例如 df 是:

    V1 V2 V3 
1   1  2  1  
2   2  2  2  
3   1  1  1  
4   2  2  1  
5   1  2  1  

在 5 行中,第 1 行全部为 1(是),所以 20% 将全部为 1,所以我希望我的结果是这样的:

all 1: 20%

数据样本 dput(DT)

   structure(list(rom = c("2", "1", "2", "2", "2", "1", "2", "1", 
"2", "2", "1", "1", "2", "2", "2", "1", "2", "2", "2", "2", "2", 
"2", "2", "1", "2", "2", "2", "2", "1", "1", "2", "2", "2", "2", 
"2", "1", "1", "1", "1", "2", "2", "2", "1", "1", "2", "2", "1", 
"1", "2", "1", "1", "2", "2", "2", "2", "1", "1"), power = c("2", 
"2", "2", "1", "1", "2", "2", "2", "2", "2", "2", "2", "2", "1", 
"2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", 
"2", "1", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", 
"2", "2", "1", "2", "2", "2", "1", "2", "2", "2", "2", "2", "2", 
"2", "2", "2", "2"), pain = c("2", "2", "3", "2", "2", "3", "2", 
"2", "2", "2", "3", "2", "3", "2", "3", "3", "3", "3", "3", "3", 
"2", "3", "3", "2", "3", "3", "2", "2", "2", "2", "3", "3", "3", 
"3", "2", "2", "3", "2", "2", "2", "3", "3", "2", "2", "3", "2", 
"2", "2", "2", "2", "2", "2", "2", "3", "3", "3", "2")), row.names = c(NA, 
-57L), class = "data.frame")

如果您的数据中只有 1 和 2,您可以使用 rowSums 计算 row-wise 总和,并计算数据框中总和等于列数的行的比率。

mean(rowSums(df) == ncol(df)) * 100
#[1] 20

数据

df <- structure(list(V1 = c(1L, 2L, 1L, 2L, 1L), V2 = c(2L, 2L, 1L, 
2L, 2L), V3 = c(1L, 2L, 1L, 1L, 1L)), class = "data.frame", 
row.names = c(NA, -5L))

也许这就是您要找的东西?

DT <- data.table::fread("V1 V2 V3 
   1  2  1  
   2  2  2  
   1  1  1  
   2  2  1  
   1  2  1  ")


table( rowSums( DT * DT == 1 ) )  / nrow(DT)


#   0   1   2   3 
# 0.2 0.2 0.4 0.2 

也许您可以使用 paste 加入列,然后使用 tableproportions 获取份额。

proportions(table(do.call(paste, DT))) * 100
#     1 1 2      1 2 2      1 2 3      2 1 2      2 2 2      2 2 3
# 5.263158 22.807018  8.771930  5.263158 22.807018 35.087719

另一个选项count

library(dplyr)
DT %>% 
    count(!!! rlang::syms(names(.))) %>%
    transmute(prop = n/sum(n) * 100)
#       prop
#1  5.263158
#2 22.807018
#3  8.771930
#4  5.263158
#5 22.807018
#6 35.087719