合并三个因子,使其因变量在R中求和
不确定是否有人回答了这个问题——我已经搜索过了,但到目前为止,没有任何东西对我有效。我试图缩小一个非常大的数据集。我需要在我的合并三个因子,使其因变量在R中求和,r,R,不确定是否有人回答了这个问题——我已经搜索过了,但到目前为止,没有任何东西对我有效。我试图缩小一个非常大的数据集。我需要在我的“PROG”变量(“Grad.2”、“Grad.3”、“Grad.H”)中组合三个因素,以便它们成为单个变量(“Grad”),其中每个可比值集的因变量(“NUMBER”)求和 即 变成 YEAR = "92/93" AGE = "20-24" PROG = "Grad" NUMBER = "77" 然后,我想删除PROG的所有其他因素,这样我就可以比较毕业
“PROG”
变量(“Grad.2”、“Grad.3”、“Grad.H”)
中组合三个因素,以便它们成为单个变量(“Grad”
),其中每个可比值集的因变量(“NUMBER”
)求和
即
变成
YEAR = "92/93" AGE = "20-24" PROG = "Grad" NUMBER = "77"
然后,我想删除PROG
的所有其他因素,这样我就可以比较毕业生的入学率,而不用担心其他因素(我会单独处理)。因此,我的主动自变量是年
和年龄
,而因变量是数
我希望这充分显示了我的数据:
structure(list
(YEAR = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L), .Label = c("92/93", "93/94", "94/95", "95/96", "96/97",
"97/98", "98/99", "99/00", "00/01", "01/02", "02/03", "03/04",
"04/05", "05/06", "06/07", "07/08", "08/09", "09/10", "10/11",
"11/12", "12/13", "13/14", "14/15", "15/16"), class = "factor"),
AGE = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L), .Label = c("1-19",
"20-24", "25-30", "31-34", "35-39", "40+", "NR", "T.Age"), class = c("ordered",
"factor")),
PROG = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
19L, 19L, 19L), .Label = c("T.Prog", "Basic", "Career", "Grad.H",
"Grad2", "Grad3", "Grad2.Qual", "Grad3.Qual", "Health.Res",
"NoProg.Grad", "NoProg.Other", "NoProg.Und.Grad", "NoProg.NoCred",
"Other", "Post.Und.Grad", "Post.Career", "Pre-U", "Career.Qual",
"Und.Grad", "Und.Grad.Qual"), class = "factor"),
NUMBER = c(104997L,
347235L, 112644L, 38838L, 35949L, 50598L, 5484L, 104991L,
333807L, 76692L)), row.names = c(7936L, 7948L, 7960L, 7972L,
7984L, 7996L, 8008L, 10459L, 10471L, 10483L), class = "data.frame")
至于我为什么使用因子,我不知道我应该如何输入数据。这些因素是有道理的,它们是R在我上传原始数据时解释原始数据的方式
我正在研究下面的建议。虽然还没有成功,但我仍在学习如何让R做我想做的事情,而且经常搞砸。我会尽快回复你们每一个人,只要我有一个合理的答案。(一旦我停止用可怜的头撞桌子……唉)我想levels()函数就是你想要的。从手册中:
## combine some levels
z <- gl(3, 2, 12, labels = c("apple", "salad", "orange"))
z
levels(z) <- c("fruit", "veg", "fruit")
z
##组合一些级别
z有多种方法可以做到这一点,但我同意FScott的观点,即您可能正在寻找levels()函数来重命名factor levels。下面是我将如何进行第二步求和
library(magrittr)
library(dplyr)
#do the renaming of the PROG variables here
#sum by PROG
df <- df %>%
group_by(PROG) %>% # you could add more variable names here to group by i.e. group_by(PROG, AGE, YEAR)
mutate(group.sum= sum(NUMBER))
旁注:我不建议做上面的块,因为你的数据中有松散的信息,而且你的数据更整洁,只要有额外的列组。sum
如果我正确理解你的问题,这应该可以做到。
我假设您的数据帧名为df
:
library(tidyverse)
df %>%
mutate(PROG = ifelse(PROG %in% c("Grad2", "Grad3","Grad.H"),
"Grad",
NA)) %>% ##combines the 3 Grad variables into one
filter(!is.na(PROG)) %>% ##drops the other variables
group_by(YEAR, AGE) %>%
summarise(NUMBER = sum(NUMBER))
略微不同的方法:只取你想要的因子,去掉因子变量(因为你想把它们作为一个组来对待),然后将所有的NUMBER
值相加,同时按所有其他变量分组df
是您的数据
aggregate(formula = NUMBER ~ .,
data = subset(df, PROG %in% c("Grad2", "Grad3", "Grad.H"), select = -PROG),
FUN = sum)
欢迎来到SO。要添加数据集,请在R中加载它,并执行类似于dput(head(data,10))
的操作。其中,data
是data.frame的名称。最后用适当的格式将其粘贴到这里。另外,您的预期输出也不完全清楚。您想将多个观察合并为一个吗?首先为什么要使用因子
?谢谢您的建议。我试图重新标记这些级别,但最终得到了我想要的3个数据实例,而不是将它们相加。我不确定这是否是你的建议,但这是我的猜测。(对不起,R还不太好。)不知道你的意思。您应该仔细阅读手册,并使用您的数据重新创建手册末尾的示例。谢谢您的建议。我尝试了你的代码,但据我所知,group.sum最终将所有内容都添加到了一起。没有足够的空间在这里发布结果,抱歉。谢谢你的建议。我很感激你解释每一步的意义。不幸的是,我得到了以下错误:mutate_impl(.data,dots)中的错误:求值错误:没有适用于类“logical”对象的“filter_”的方法。我编辑了我的注释,缺少Parethes。还将“Grad.2”和“Grad.3”更改为“Grad2”和“Grad3”,以便它与示例数据集匹配。
#condense df down
df$number <- df$group.sum
df <- df[,-ncol(df)]
df <- unique(df)
library(tidyverse)
df %>%
mutate(PROG = ifelse(PROG %in% c("Grad2", "Grad3","Grad.H"),
"Grad",
NA)) %>% ##combines the 3 Grad variables into one
filter(!is.na(PROG)) %>% ##drops the other variables
group_by(YEAR, AGE) %>%
summarise(NUMBER = sum(NUMBER))
aggregate(formula = NUMBER ~ .,
data = subset(df, PROG %in% c("Grad2", "Grad3", "Grad.H"), select = -PROG),
FUN = sum)