0

我有一个数据框如下:

ID Col1 响应ID Col3 Col4
1 蓝色的 729Ad 3.2 一个
2 295gS 6.5 一个
3 红色的 729Ad 8.4
4 黄色 592Jd 2.9 一个
5 绿色 937sa 3.5

我想计算一个新列 Col5,如果该行的 Col4 值为 A,并且数据集中某处存在另一列,则其值为 1,该行具有相同的 RespId 但 Col4 值为 B。否则为值是 0。然后我将删除 Col4 值为 B 的所有行,只保留那些具有 A 的行。我想使用 R tidymodels 配方包来做到这一点。我也想用数据框来做这一切。

这是在删除 Col4 值为 B 的行之前所需的输出表的样子:

ID Col1 响应ID Col3 Col4 Col5
1 蓝色的 729Ad 3.2 一个 1
2 295gS 6.5 一个 0
3 红色的 729Ad 8.4 0
4 黄色 592Jd 2.9 一个 0
5 绿色 937sa 3.5 0
4

2 回答 2

1

这是否有效:

library(dplyr)
df %>% group_by(RespID) %>% mutate(col5 = case_when(Col4 == 'A' & last(Col4 == 'B') ~ 1, Col4 == 'B' & first(Col4 == 'B')  ~ 0, TRUE ~ 0))
# A tibble: 5 x 6
# Groups:   RespID [4]
     ID Col1   RespID  Col3 Col4   col5
  <int> <chr>  <chr>  <dbl> <chr> <dbl>
1     1 blue   729Ad    3.2 A         1
2     2 orange 295gS    6.5 A         0
3     3 red    729Ad    8.4 B         0
4     4 yellow 592Jd    2.9 A         0
5     5 green  937sa    3.5 B         0
于 2021-10-23T14:19:21.203 回答
1

你可以试试——

library(dplyr)

df %>%
  group_by(RespID) %>%
  mutate(Col5 = as.integer(all(c('A', 'B') %in% Col4) & Col4 == 'A')) %>%
  ungroup

#     ID Col1   RespID  Col3 Col4   Col5
#  <int> <chr>  <chr>  <dbl> <chr> <int>
#1     1 blue   729Ad    3.2 A         1
#2     2 orange 295gS    6.5 A         0
#3     3 red    729Ad    8.4 B         0
#4     4 yellow 592Jd    2.9 A         0
#5     5 green  937sa    3.5 B         0

all(c('A', 'B') %in% Col4)检查两者ABvalue 是否都存在,RespIDCol4 == 'A'只会在'A'存在的地方给出 1。

数据

df <- structure(list(ID = 1:5, Col1 = c("blue", "orange", "red", "yellow", 
"green"), RespID = c("729Ad", "295gS", "729Ad", "592Jd", "937sa"
), Col3 = c(3.2, 6.5, 8.4, 2.9, 3.5), Col4 = c("A", "A", "B", 
"A", "B")), row.names = c(NA, -5L), class = "data.frame")
于 2021-10-23T14:34:06.257 回答