有没有办法要求行值在 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
加入列,然后使用 table
和 proportions
获取份额。
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
所以我的问题听起来不太正确,但我不知道如何更正确地表达它。
我正在尝试执行以下操作。我有一个包含 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
加入列,然后使用 table
和 proportions
获取份额。
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