我有一個看起來像這樣的資料檔案。
id <- c(1001, 1002, 1003, 1004, 1005, 1006)
var1 <- c(1, 0, 1, 0, 1, 1)
var2 <- c(1, 1, 1, 1, 1, 0)
var3 <- c(0, 0, 1, 1, 1, 0)
file <- data.frame (id, var1, var2, var3)
file
我們有幾個不同的變數,它們都以相同的方式進行評分,在本例中為 0 和 1。我想計算所有 1 的回應和每個變數的百分比,并將其匯出為資料框。
這是我希望最終產品的樣子
variable response count percent
var1 1 4 66.67
var2 1 5 83.33
var3 1 3 50.00
我可以為每個單獨的變數生成表格和概率表格,并像這樣手動復制資訊。
table (file$var1, exclude = FALSE)
table (file$var2, exclude = FALSE)
table (file$var3, exclude = FALSE)
不幸的是,我有很多變數需要以這種方式計算,所以這不起作用。是否有設定 for 回圈的功能或方法。
uj5u.com熱心網友回復:
我們可以遍歷 'var' 列名,獲取table
并添加比例,subset
然后 rbindbase R
out <- do.call(rbind, lapply(grep("var", names(file), value = TRUE),
function(nm) cbind(variable = nm,
subset(transform(as.data.frame(table(file[[nm]])),
percent = proportions(Freq)), Var1 == 1))))
row.names(out) <- NULL
names(out)[2:3] <- c('response', 'count')
-輸出
> out
variable response count percent
1 var1 1 4 0.6666667
2 var2 1 5 0.8333333
3 var3 1 3 0.5000000
或在tidyverse
library(dplyr)
library(tidyr)
file %>%
select(-id) %>%
pivot_longer(everything(), names_to = 'variable',
values_to = 'response') %>%
count(variable, response, name = 'count') %>%
group_by(variable) %>%
mutate(percent = proportions(count)) %>%
ungroup %>%
filter(response == 1)
-輸出
# A tibble: 3 × 4
variable response count percent
<chr> <dbl> <int> <dbl>
1 var1 1 4 0.667
2 var2 1 5 0.833
3 var3 1 3 0.5
uj5u.com熱心網友回復:
你想要的是colSums
你rowSums
的變數。
sapply(c(colSums, colMeans), \(f) f(file[-1]))
# [,1] [,2]
# var1 4 0.6666667
# var2 5 0.8333333
# var3 3 0.5000000
或略顯精致
v <- c('var1', 'var2', 'var3')
data.frame(variable=v,
mapply(\(f, z) f(file[v]*z), list(count=colSums, percent=colMeans), c(1, 100)),
row.names=NULL)
# variable count percent
# 1 var1 4 66.66667
# 2 var2 5 83.33333
# 3 var3 3 50.00000
資料:
file <- structure(list(id = c(1001, 1002, 1003, 1004, 1005, 1006), var1 = c(1,
0, 1, 0, 1, 1), var2 = c(1, 1, 1, 1, 1, 0), var3 = c(0, 0, 1,
1, 1, 0)), class = "data.frame", row.names = c(NA, -6L))
uj5u.com熱心網友回復:
另一種tidyverse
解決方案:
library(tidyverse)
summarise(file, across(contains("var"), sum), response = 1) |>
pivot_longer(-response, names_to = "variable", values_to = "count") |>
mutate(percent = (count/nrow(file))*100)
#> # A tibble: 3 x 4
#> response variable count percent
#> <dbl> <chr> <dbl> <dbl>
#> 1 1 var1 4 66.7
#> 2 1 var2 5 83.3
#> 3 1 var3 3 50
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/526996.html
標籤:r