r - 根据 R 中的两个布尔列值将值保留在列的单行中
问题描述
我在下面给出示例以了解问题
我必须根据“之前”和“之后”列将“已解决”列更改为输入数据框下方。如果前列为 TRUE,后列为 FALSE,则“已解决”列应在每个“坐”列组末尾的一行中包含“名称”列的所有名称。
输入数据框:
id name sect sit before after
23 name23 sec34 sit34 TRUE FALSE
28 name28 sec13 sit89 FALSE FALSE
12 name12 sec13 sit34 FALSE FALSE
76 name76 sec45 sit34 FALSE TRUE
45 name45 sec56 sit56 FALSE FALSE
145 name14 sec65 sit34 TRUE FALSE
90 name90 sec74 sit56 FALSE FALSE
15 name15 sec89 sit89 TRUE FALSE
78 name78 sec45 sit56 FALSE FALSE
预期结果:
id name sect sit before after solved
23 name23 sec34 sit34 TRUE FALSE
12 name12 sec13 sit34 FALSE FALSE
145 name14 sec65 sit34 TRUE FALSE
76 name76 sec45 sit34 FALSE TRUE name23,name14
45 name45 sec56 sit56 FALSE FALSE
78 name78 sec45 sit56 FALSE FALSE
90 name90 sec74 sit56 FALSE FALSE nothing here
15 name15 sec89 sit89 TRUE FALSE
28 name28 sec13 sit89 FALSE FALSE name15
解决方案
dplyr
解决方案
library(dplyr)
df %>%
group_by(sit) %>%
arrange(name, .by_group = T) %>%
mutate(solved = if_else(row_number() == n(),
toString(name[before > after]),
NA_character_))
# A tibble: 9 x 7
# Groups: sit [3]
id name sect sit before after solved
<int> <fct> <fct> <fct> <lgl> <lgl> <chr>
1 12 name12 sec13 sit34 FALSE FALSE NA
2 145 name14 sec65 sit34 TRUE FALSE NA
3 23 name23 sec34 sit34 TRUE FALSE NA
4 76 name76 sec45 sit34 FALSE TRUE "name14, name23"
5 45 name45 sec56 sit56 FALSE FALSE NA
6 78 name78 sec45 sit56 FALSE FALSE NA
7 90 name90 sec74 sit56 FALSE FALSE ""
8 15 name15 sec89 sit89 TRUE FALSE NA
9 28 name28 sec13 sit89 FALSE FALSE "name15"
推荐阅读
- c# - 在 C# 中的串行通信中按下一个键时消除延迟
- mysql - 选择平均值小于指定值的所有条目
- javascript - 如果数组项包含字符串但不包含其他字符串,则删除字符串
- android - 导航组件 - 未生成方向类
- javascript - 使用 JavaScript 将下一个和上一个按钮添加到模态
- c++ - 为什么 C++ 需要 6 个大小的数组来存储 5 个字母单词,而 C 只允许 5 个?
- struct - 如何为自定义结构实现复制特征?
- xcode - 已完成请求崩溃报告。继续测试 - Jenkins 管道 Xcode 测试用例失败
- ruby-on-rails - Rails - 使用特定属性值缓存所有用户
- python - 查看使用 Heroku 和 S3 处理图像花费了太多时间