[英]Combing a categorical variable to create a new categorical variable in R
更新
我想基于我的数据框中现有的分类变量创建一个新的分类变量。 我要这样做的方法是通过合并某些级别的值并创建不同的级别
这是工作
fac1 <- c("A","B", "C", "E", "F", "10", "11", "12", "19")
x1 <- c(NA,2,NA,3,4,5,6,7,NA)
data1 <- data.frame(fac1,x1)
fac1 x1
1 A NA
2 B 2
3 C NA
4 E 3
5 F 4
6 10 5
7 11 6
8 12 7
9 19 NA
考虑到data1
是工作数据帧, fact1
是类别变量。 基于上面看到的级别以及x1
显示的值,我想创建一个新的分类变量,该变量将fac1
的级别组合起来以创建新级别,并取x
显示的各个值的平均值 。
预期结果:
fac1 fac2 x1
1 A A NA
2 B B 2
3 C C-E 3
4 E C-E 3
5 F F 4
6 10 10-12 6
7 11 10-12 6
8 12 10-12 6
9 19 19 NA
更新2
大多数答案都能正常工作,由于某种原因,``x1''中的值都用均值填充-我已经按不同类别进行了解释,但存在相同的问题。我无法理解数据库中问题的根源,我怀疑这是与mean
函数有关。
这是我从我的原始数据库中获得的信息,其中x1
是根据此示例替换旧值的变量。
ind year HH_index cou ind_2 ind2 x1
<fct> <chr> <dbl> <chr> <chr> <fct> <dbl>
1 A 1995 NA AT A A 0.188
2 B 1995 NA AT B B 0.188
3 10-12 1995 NA AT 10-12 10-12 0.188
4 10 1995 NA AT 10-12 10-12 0.188
5 11 1995 NA AT 10-12 10-12 0.188
6 12 1995 NA AT 10-12 10-12 0.188
7 13 1995 NA AT 13-15 13 0.188
8 14 1995 NA AT 13-15 14 0.188
9 D 1995 NA AT D-E D-E 0.188
10 15 1995 NA AT 13-15 15 0.188
如果我理解正确,假设您只想组合C和E行,那么您想要的内容将类似于以下内容:
library(data.table)
setDT(data1)
data1[fac1 %in% c("C", "E"), c("fac2", "x1") := .("C-E", mean(x1))]
data1[is.na(fac2), fac2 := fac1]
尽管在您的情况下, fac1 %in% c("C", "E")
的x1
平均值不是3
,但它是NA
。 如果要删除NA
,只需在平均值上加上na.rm = TRUE
即可。
过程中的关键是找到一种方法,以一种过程可以理解的方式来指定分组哲学。 鉴于您要将不同的值分组在一起,最简单的方法是创建分组的查找表,该表将由流程使用。
请参阅以下示例:
# example data
fac1 <- c("A","B", "C", "E", "F", "10", "11", "12", "19")
x1 <- c(NA,2,NA,3,4,5,6,7,NA)
data1 <- data.frame(fac1,x1, stringsAsFactors = F)
library(dplyr)
# specify values to group together as a look up table
# (this is what you should create to specify your grouping philosophy)
look_up = data.frame(fac1 = c("C","E","10","12"),
group = c(1,1,2,2), stringsAsFactors = F)
look_up
# fac1 group
# 1 C 1
# 2 E 1
# 3 10 2
# 4 12 2
# update look up table
# (you can create a look up table like this straight away if you prefer)
look_up = look_up %>%
group_by(group) %>%
mutate(fac2 = paste0(fac1, collapse = "-")) %>%
ungroup() %>%
select(-group)
look_up
# # A tibble: 4 x 2
# fac1 fac2
# <chr> <chr>
# 1 C C-E
# 2 E C-E
# 3 10 10-12
# 4 12 10-12
data1 %>%
left_join(look_up, by="fac1") %>%
group_by(fac2 = ifelse(is.na(fac2), fac1, fac2)) %>%
mutate(x1 = mean(x1, na.rm = T)) %>%
ungroup()
# # A tibble: 9 x 3
# fac1 x1 fac2
# <chr> <dbl> <chr>
# 1 A NaN A
# 2 B 2 B
# 3 C 3 C-E
# 4 E 3 C-E
# 5 F 4 F
# 6 10 6 10-12
# 7 11 6 11
# 8 12 6 10-12
# 9 19 NaN 19
您可以尝试使用plyr
的mapvalues
函数与tidyverse
一起重命名因子标签。 其中from
是要替换的项目的向量,而to
是替换值相同长度的向量。 然后分组并计算新的x1
值。
library(tidyverse)
data1 %>%
mutate(fac2=plyr::mapvalues(fac1, from = c("C", "E", 10:12),
to = rep(c("C-E", "10-12"),c(2,3)))) %>%
group_by(fac2) %>%
mutate(x1=mean(x1, na.rm = T))
# A tibble: 9 x 3
# Groups: fac2 [6]
fac1 x1 fac2
<fct> <dbl> <fct>
1 A NaN A
2 B 2 B
3 C 3 C-E
4 E 3 C-E
5 F 4 F
6 10 6 10-12
7 11 6 10-12
8 12 6 10-12
9 19 NaN 19
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.