r - 如果它们不同,则用它们的字符串分隔列
问题描述
我有一个数据框,如果它们包含不同的字符串或单词,我想拆分它们的列。
我在 R 中尝试不同的方法,但它不起作用
我的数据框如下所示:
df <- data.frame(x = c(NA, "TAP1", "TAP1", "TAP2"), y = c("TAP1", "TAP2", "TAP2", "TAP3" ))
而且,例如,我正在尝试使用第一列:
df <- data.frame(x = c(NA, "TAP1", "TAP1", "TAP2"))
df %>% separate(x, c("TAP1", "TAP2"), extra = "drop", fill = "right")
但不工作
我有下一个输出:
TAP1 TAP2
1 <NA> <NA>
2 TAP1 <NA>
3 TAP1 <NA>
4 TAP2 <NA>
我的预期输出是:
TAP1 TAP2
1 <NA> <NA>
2 TAP1 <NA>
3 TAP1 <NA>
4 <NA> TAP2
我想对完整数据框中的所有列执行相同的操作,其中我有不同的单词组合,如 TAP1、TAP2、TAP3 ... 等。
在此示例中,考虑到列 x 和 y 的最终表格将是。
df <- data.frame(x = c(NA, "TAP1", "TAP1", "TAP2"), y = c("TAP1", "TAP2", "TAP2", "TAP3" ))
TAP1 TAP2 TAP1.1 TAP2.2 TAP3.3
1 <NA> <NA> TAP1 <NA> <NA>
2 TAP1 <NA> <NA> TAP2 <NA>
3 TAP1 <NA> <NA> TAP2 <NA>
4 <NA> TAP2 <NA> <NA> TAP3
解决方案
我们可以做到这一点spread
library(tidyverse)
df %>%
mutate(n = row_number()) %>%
group_by(x) %>%
mutate(rn = row_number(), y = x) %>%
spread(y, x) %>%
select(TAP1, TAP2)
# A tibble: 4 x 2
# TAP1 TAP2
# <fct> <fct>
#1 <NA> <NA>
#2 TAP1 <NA>
#3 TAP1 <NA>
#4 <NA> TAP2
有了多个列,我们可以gather
和spread
rownames_to_column(df, 'rn') %>%
gather(key, val, -rn) %>%
mutate(val1 = val) %>%
unite(val, val,key) %>%
group_by(val) %>% # not really need for this example
mutate(ind = row_number()) %>% # not needed here though
spread(val, val1) %>%
select(starts_with("TAP"))
# A tibble: 4 x 5
# TAP1_x TAP1_y TAP2_x TAP2_y TAP3_y
# <chr> <chr> <chr> <chr> <chr>
#1 <NA> TAP1 <NA> <NA> <NA>
#2 TAP1 <NA> <NA> TAP2 <NA>
#3 TAP1 <NA> <NA> TAP2 <NA>
#4 <NA> <NA> TAP2 <NA> TAP3
推荐阅读
- ubuntu - ssh 总是卡住从 GCP 到另一台服务器的连接
- javascript - Eventet 侦听器未执行功能
- javascript - Reactjs:使用状态挂钩单击时如何选择一张或多张卡片?
- sql - 基于匹配值的另一个表中的雪花 SQL 总和
- r - 通过调整函数在训练模型时更改 SVM 类型
- python - Django 无法正确地从一个视图重定向到另一个视图
- google-cloud-platform - 缓解 Cloud Run 对每个实例的 Cloud SQL 连接数的限制
- python-3.x - 如何使用键值对列表创建数据结构?
- c - 为在 JNA 中使用的依赖 C 程序创建共享库
- angular - 等待异步结果后如何构造类