希望我不是重复别人的问题,也许是与我的另一个问题类似的问题。
我在努力
1.按ID
对行进行分组
1.然后:a)将'A'分配给那些只收到产品'A'的人B)将'P'分配给那些只收到产品'P'的人c)将'A和P'分配给那些收到两种产品的人d)将NA分配给那些既没有收到A也没有收到P的人
我的数据df
df <- read.table(text =
" ID Product
1 1 A
2 1 A
3 1 A
4 2 NA
5 2 NA
6 3 P
7 3 P
8 4 A
9 4 P
10 5 A
11 6 P
12 7 NA ")
我想要的输出:
ID Product Group
1 1 A A
2 1 A A
3 1 A A
4 2 NA NA
5 2 NA NA
6 3 P P
7 3 P P
8 4 A A_P
9 4 P A_P
10 5 A A
11 6 P P
12 7 NA NA
我尝试了一些方法,但新的专栏没有出现:
df$Group <- df %>%
group_by(ID) %>%
ifelse(all(df$Product==A), "A",
ifelse(all(df$Product==P), "P",
ifelse(all(df$Product==NA), "NA", "A_P") %>%
ungroup()
我也试过:
df$group <- df%>%
group_by(ID) %>%
if(all(df$Product=="A") {
df$group="A"
} else if(all(df$Product=="P") {
df$group="P"
} else if(all(df$Product==NA) {
df$group=NA
} else {df$group="A_P"}
但是它一直说我的}
不应该在那里,这对我来说没有意义?
我的另一个问题:可以在ifelse
语句中使用all
来表示非数值向量吗?
谢谢。
5条答案
按热度按时间6tqwzwtp1#
使用
ave
,避免使用if-else。可以考虑
toString
,使其以逗号分隔wvyml7n52#
下面是我使用base R和几行可读代码的尝试。:)
r8xiu3jd3#
类似于@jay.sf:
w6lpcovy4#
我发现了一个非常丑陋的解决方案,使用pivot_wider然后paste0来创建一个新的data.table,其中包含您的组,然后使用right_join将组放回原始数据集中:
有什么问题尽管问。
h9a6wy2h5#
这里有一个方法。你的尝试所缺少的是你必须
mutate
数据集。参见罗兰的评论。
创建于2023-03-28带有reprex v2.0.2