根据另一个变量的值创建虚拟变量?

时间:2020-06-09 17:28:19

标签: r function loops dataframe

我有一个大型数据集,具有以下结构的多列

    A    B      
1.  1.   D1  
2.  1.   D2
3.  2    D2
4.  3.   D1
5.  3.   D2

我正在尝试根据A列中的唯一观察结果创建一个新的数据帧,并使用一个虚拟变量“虚拟”将其编码为1 = D1、2 = D2、3 =两者,就像这样:

    A.  Dummy
1.  1.   3
2.  2.   2
3.  3.   3

您知道我该怎么做吗?

3 个答案:

答案 0 :(得分:0)

您可以使用aggregate

aggregate(B ~ A, df, function(x) if(all(x == "D1")) 1 else if(all(x == "D2")) 2 else 3)

#   A B
# 1 1 3
# 2 2 2
# 3 3 3

答案 1 :(得分:0)

另一种可能的解决方案:

df %>% 
  group_by(A) %>% 
  summarise(B = paste0(B, collapse = "_")) %>% 
  mutate(Dummy = case_when(
    B == "D1" ~ 1,
    B == "D2" ~ 2,
    B == "D1_D2" |  B == "D2_D1" ~ 3,
    TRUE ~ NA_real_
  )) %>% 
  select(-B)

结果

# A tibble: 3 x 2
      A Dummy
  <dbl> <dbl>
1     1     3
2     2     2
3     3     3

答案 2 :(得分:0)

这里是dplyr的一个选项。按'A'分组后,if的不同元素数大于1,返回3或else使用命名向量来匹配'B'的first元素

library(dplyr)
df1 %>% 
   group_by(A) %>% 
   summarise(Dummy = if(n_distinct(B) > 1) 3L else 
       setNames(1:2, c("D1", "D2"))[first(B)])
# A tibble: 3 x 2
#      A Dummy
#* <dbl> <int>
#1     1     3
#2     2     2
#3     3     3

数据

df1 <- structure(list(A = c(1, 1, 2, 3, 3), B = c("D1", "D2", "D2", 
"D1", "D2")), class = "data.frame", row.names = c("1.", "2.", 
"3.", "4.", "5."))