R 在数据复杂的情况下如何分隔_行
说真的,这个问题本来不是我的。促使我把它放在一个简化的箱子里 因此,我必须根据分隔符(即R 在数据复杂的情况下如何分隔_行,r,tidyverse,tidyr,delimiter,delimiter-separated-values,R,Tidyverse,Tidyr,Delimiter,Delimiter Separated Values,说真的,这个问题本来不是我的。促使我把它放在一个简化的箱子里 因此,我必须根据分隔符(即)将输入单元格(在列中)的数据分隔成单独的行在当前场景中。这可以使用tidyr::separate_rows()轻松完成。列中的数据已连接。现在的问题,实际上有两个,是- 可能有用分隔的文本但可以位于闭括号内(),例如(text\u A;text\u B),该括号将被左键连接,且不被分隔 每行中不同列的单元格之间的连接数可能不均匀。在这种情况下,该行将被分解为单独的行,等于最大连接数。对于连接较少的其他列,最
)将输入单元格(在列中)的数据分隔成单独的行代码>在当前场景中。这可以使用tidyr::separate_rows()
轻松完成。列中的数据已连接。现在的问题,实际上有两个,是-
可能有用分隔的文本
但可以位于闭括号内()
,例如(text\u A;text\u B)
,该括号将被左键连接,且不被分隔
每行中不同列的单元格之间的连接数可能不均匀。在这种情况下,该行将被分解为单独的行
,等于最大连接数。对于连接较少的其他列,最后一个text_值可能只是重复
可再现的示例如下所示
input提取想要的组。计算每行的最大长度和填充值
input <- input %>%
mutate(across(everything(), str_extract_all, pattern = "(\\([^\\(\\)]+\\)|[^;]+)"))
input_l <- pmap_int(input, ~max(map_int(list(...), length)))
input %>%
split(seq_len(nrow(.))) %>%
map(flatten) %>%
map2_dfr(input_l, function(row, l) map_dfr(row, ~c(.x, rep(last(.x), l - length(.x)))))
input%
突变(跨越(everything(),str_extract_all,pattern=“(\\([^\\(\\)]+\\)\\[^;]+]))
输入百分比
拆分(序号(nrow(%))%>%
地图(展平)%>%
map2_-dfr(输入_-l,函数(行,l)映射_-dfr(行,~c(.x,rep(last(.x),l-length(.xе))
这将提供以下输出
col_1 Col_2 Col_3 Col_4
<chr> <chr> <chr> <chr>
1 A Text_A Text_1 Text_a
2 A Text_B Text_1 (Text_b;Text_c)
3 A Text_B Text_1 (Text_d;Text_dd)
4 B Text_C Text_2 Text_e
5 B Text_C Text_3 Text_e
6 C Text_D Text_4 Text_f
7 C (Text_E;Text_F) Text_4 Text_g
第1列第2列第3列第4列
一个文本一个文本一个文本
2 A Text_B Text_1(Text_B;Text_c)
3 A文本B文本1(文本d;文本dd)
4 B文本C文本2文本e
5 B文本C文本3文本e
6 C文本D文本4文本f
7 C(文本;文本)文本4文本
以下是我的方法,假设您的列中没有序列”
:
input %>%
mutate(across(-col_1,
~ str_replace_all(., "\\([^)]*\\)",
\(x) str_replace_all(x, ";", "<sep>")))) %>%
pmap(\(...) {
args <- list(...)
entries <- map(args[-1], ~ first(str_split(., ";")))
map(entries, \(e) {
c(e, rep(e[length(e)], do.call(max, map(entries, length)) - length(e)))
}) %>%
bind_rows() %>%
bind_cols(args[1], .)
}) %>%
bind_rows() %>%
mutate(across(-col_1, ~ str_replace_all(., "<sep>", ";")))
输入%>%
突变(跨(-col_1,
~str\u replace\u all(,“\\([^)]*\\)”,
\(x) str_replace_all(x,“;”,“)%%>%
pmap(\(…){
args%
bind_cols(args[1],)
}) %>%
绑定_行()%>%
变异(跨越(-col_1,~str_replace_all(,“”,“;”))
返回:
# A tibble: 7 x 4
col_1 Col_2 Col_3 Col_4
<chr> <chr> <chr> <chr>
1 A Text_A Text_1 Text_a
2 A Text_B Text_1 (Text_b;Text_c)
3 A Text_B Text_1 (Text_d;Text_dd)
4 B Text_C Text_2 Text_e
5 B Text_C Text_3 Text_e
6 C Text_D Text_4 Text_f
7 C (Text_E;Text_F) Text_4 Text_g
#一个tible:7 x 4
第1列第2列第3列第4列
一个文本一个文本一个文本
2 A Text_B Text_1(Text_B;Text_c)
3 A文本B文本1(文本d;文本dd)
4 B文本C文本2文本e
5 B文本C文本3文本e
6 C文本D文本4文本f
7 C(文本;文本)文本4文本
row3 col2应该是文本B而不是文本A。最后一个要重复的值。让我检查一下您的策略,这将开始从头开始重复值。为什么只复制最后一个值?例如,当你有1,2,3,你需要让它的长度为5,它应该是什么样子?这只是这样的要求。五行中的1,2,3的示例shd为1,2,3,3确定我编辑为仅复制最后一个值。这现在应该适用于括号内的2个以上的值。谢谢@ktiu。实际上比前面的答案要好。如果还有更多的策略/答案,我会等待,否则我会接受:)
# A tibble: 7 x 4
col_1 Col_2 Col_3 Col_4
<chr> <chr> <chr> <chr>
1 A Text_A Text_1 Text_a
2 A Text_B Text_1 (Text_b;Text_c)
3 A Text_B Text_1 (Text_d;Text_dd)
4 B Text_C Text_2 Text_e
5 B Text_C Text_3 Text_e
6 C Text_D Text_4 Text_f
7 C (Text_E;Text_F) Text_4 Text_g