gpt4 book ai didi

r - 计算多个变量的因子水平出现次数并将结果汇​​总到一张表中

转载 作者:行者123 更新时间:2023-12-02 01:45:32 25 4
gpt4 key购买 nike

这是我在这里的第一篇文章,我对编程和 R 还很陌生。所以请原谅我的愚蠢行为。

我有以下数据框:

a <- data.frame("sickness1" = c(1,1,2,3,3,5,6, 4, 4, 4),
"sickness2" = c(NA, NA, 3, 3, 4, 6, 1, 2, 5, 6),
"sickness3" = c(NA, NA, 3, 4, 4, 6, 1, 2, 5, 6),
"sickness4" = c(NA, NA, 6, 3, 4, 6, 1, 2, 5, 6))

每一行代表一个案例。每列都是一个有序的因子变量。我将变量转换为这样的因子(使用我在 stackoverflow 上找到的提示!):

a[] <- lapply(a, factor,
levels = c(1:6),
labels = c(3, 25, 50, 75, 97, 100))

我想得到以下输出:

  percent   sickness1           sickness2    sickness3       sickness4
1 3 1 1 1 2
2 25 1 1 1 1
3 50 2 1 1 2
4 75 1 2 1 3
5 97 1 1 1 1
6 100 2 2 3 1

我已经找到了一个非常冗长的解决方案:

# counting
ab <- ldply(lapply(a, count))

#getting it into the right format
ab2 <- dcast(
data = ab,
formula = x ~ .id,
value.var = "freq")

# changing the name of the first column
colnames(ab2)[1] <- "percent"

#deleting row 7 cause it contains the NAs which I dont want to have
ab2 <- ab2[-7,]
ab2

有没有更快更简单的方法来做到这一点?就像以某种方式使用 ddply 一样?summary(a) 给我的输出太乱了,我不知道如何操作它以使其看起来像我想要的那样。此外,我正在处理的真实数据要大得多,我必须多次执行此类操作....

最佳答案

好的,所以我发现有两种可能的解决方案:

akrun 的 Nr1:

un1 <- as.character(sort(unique(unlist(a, use.names=FALSE))))
data.frame(percent=un1,do.call(cbind,
lapply(a, function(x) table(factor(x, levels=un1)))))

alexis_laz 的 Nr.2:

鉴于我可以很容易地使数据看起来像这样:(这就是上面的数据框,其中为机构添加了一列)

a <- data.frame("institution" = c(1:10), "sickness1" = c(1,1,2,3,3,5,6, 4, 4, 4),
"sickness2" = c(NA, NA, 3, 3, 4, 6, 1, 2, 5, 6),
"sickness3" = c(NA, NA, 3, 4, 4, 6, 1, 2, 5, 6),
"sickness4" = c(NA, NA, 6, 3, 4, 6, 1, 2, 5, 6))

a[-1] <- lapply(a[-1], factor,
levels = c(1:6),
labels = c("0 to 3%","4-25%", "25-50%", "51-75%","76-97%","97-100%"))

然后我可以将这种宽数据格式转换为像这样的长数据格式:

b2 <- melt(a, id.vars = "institution")

然后正常的表函数工作:

table(b2[[3]], b2[[2]])

注意顺序很重要

非常感谢大家!

关于r - 计算多个变量的因子水平出现次数并将结果汇​​总到一张表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25952774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com