我有一个大型数据集,具有以下结构的多列
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
您知道我该怎么做吗?
答案 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."))