我有一个包含超过150000个条目的数据帧。以下示例:
ID <- 1111, 1222, 3333, 4444, 1555, 6666
V1 <- 1, 0, 1, 0, 0, 0
V2 <- 1, 0, 0, 0, 0, 1
V3 <- 0, 1, 1, 0, 0, 1
V4 <- 1, 0, 1, 1, 0, 0
AgeGr <- 15-24,24-35,15-24,35-48, 48+, 35-48
所有变量(示例中的V1-V4(都是0/1中回答的二分问题。现在,我想总结一下不同年龄组每个变量0/1的所有发生情况。我希望输出如下:
Variable V1 V2 V3 V4 # Variale names
Answer 0 1 0 1 0 1 0 1 # answer levels (1/0)
15-24 0 2 1 1 1 1 0 2 # the frequency of "0" and "1" under this age group
24-35 1 0 1 0 0 1 1 0
35-48 2 0 1 1 1 1 0 1
48+ 1 0 1 0 1 0 1 0
我试过janitor::tabyl,使用tabyl(df,AgeGr,V1(。然而,它只在一行中总结了V1。当我尝试tabyl(df,AgeGr,df[,V1:V4](时,它失败了。我想知道我是否可以使用tabyl((并使用像appley((这样的函数?还是我应该转向其他方面?
如有任何建议,我们将不胜感激。提前感谢:(
您可以执行以下操作:
ID <- c(1111, 1222, 3333, 4444, 1555, 6666)
V1 <- c(1, 0, 1, 0, 0, 0)
V2 <- c(1, 0, 0, 0, 0, 1)
V3 <- c(0, 1, 1, 0, 0, 1)
V4 <- c(1, 0, 1, 1, 0, 0)
AgeGr <- c("15-24","24-35","15-24","35-48", "48+", "35-48")
df <- data.frame(ID=ID,V1=V1,V2=V2,V3=V3,V4=V4,AgeGr = AgeGr, stringsAsFactors = FALSE)
ageAnswerSplit <- split(df[,c("V1","V2","V3","V4")],df[["AgeGr"]])
summarized <- do.call("rbind",lapply(ageAnswerSplit, function(answerdf) {
answertables <- lapply(names(answerdf), function(nam) {
at <- table(answerdf[[nam]])
setNames(data.frame(unname(at["0"]),unname(at["1"])),paste0(nam,":",c(0,1)))
})
do.call("cbind",answertables)
}))
summarized[is.na(summarized)] <- 0
导致
> summarized
V1:0 V1:1 V2:0 V2:1 V3:0 V3:1 V4:0 V4:1
15-24 0 2 1 1 1 1 0 2
24-35 1 0 1 0 0 1 1 0
35-48 2 0 1 1 1 1 1 1
48+ 1 0 1 0 1 0 1 0
这里有一个tidyverse
选项-
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = starts_with('V')) %>%
count(AgeGr, name, value) %>%
unite(col, name, value) %>%
arrange(col) %>%
pivot_wider(names_from = col, values_from = n, values_fill = 0)
# AgeGr V1_0 V1_1 V2_0 V2_1 V3_0 V3_1 V4_0 V4_1
# <chr> <int> <int> <int> <int> <int> <int> <int> <int>
#1 24-35 1 0 1 0 0 1 1 0
#2 35-48 2 0 1 1 1 1 1 1
#3 48+ 1 0 1 0 1 0 1 0
#4 15-24 0 2 1 1 1 1 0 2