我需要找到两个具有两个水平的因子之间的所有组合
性别:男女 种族:白非白
我希望输出为: 男白 女白 男性非白色 女非白人
答案 0 :(得分:4)
我们可以使用outer
和paste
c(outer(levels(df1$Sex), levels(df1$Race), FUN = paste, sep="-"))
#[1] "Female-Nonwhite" "Male-Nonwhite" "Female-White" "Male-White"
或与expand.grid
do.call(paste, c(expand.grid(lapply(df1[c("Sex", "Race")], levels)), sep="_"))
#[1] "Female_Nonwhite" "Male_Nonwhite" "Female_White" "Male_White"
或使用rep
和paste
paste(rep(levels(df1$Sex), each = length(levels(df1$Race))), levels(df1$Race), sep="_")
#[1] "Female_Nonwhite" "Female_White" "Male_Nonwhite" "Male_White"
df1 <- data.frame(Sex = sample(c("Male", "Female"), 10, replace = TRUE),
Race = sample(c("White", "Nonwhite"), 10, replace = TRUE))
答案 1 :(得分:2)
当我阅读请求时,我认为可以用几种方法来解释它,而您真正想要的是将这些组合制成表格。有两种方法。使用@akruns示例:
set.seed(123)
df1 <- data.frame(Sex = sample(c("Male", "Female"), 10, replace = TRUE),
Race = sample(c("White", "Nonwhite"), 10, replace = TRUE))
with( df1, as.matrix( # this results in a vertical arrangement
table( # this does the counting
interaction(Sex, Race, sep=" - ")
#`interaction()` creates a variable to be tabulated for each line
) ) )
#-------------------
[,1]
Female - Nonwhite 1
Male - Nonwhite 4
Female - White 3
Male - White 2
顺序将取决于级别。默认情况下,它们是字母顺序的,但可以控制。
我还考虑过使用xtabs
,如果表格总数已经在数据中,并且您希望将它们排列在列联矩阵中,这将特别有用。