[英]How to prevent tidyr's separate function from pulling in row numbers and then dropping data
每當遇到大寫字母而不刪除字母時,我都試圖編寫一行代碼來分隔文本字符串。 我采取的方法如下:
set.seed(1)
# create a dataframe of fused alpha numeric codes that I wish to separate
df1 <- as.data.frame(matrix(
paste0(sample(LETTERS, 20, replace = TRUE), sample(seq(1, 7, 0.1), 20, replace = TRUE)),
nrow = 10)) %>% unite(col = "ab", sep = "")
df1
# Add a space (" ") before any captial letter encountered
df2 <- df1 %>% mutate(ab = gsub('([[:upper:]])', ' \\1', ab))
df2
# use separate to split the column based on the space
df3 <- df2 %>% separate(col=ab, into=c("a", "b"), sep = " ")
df3
當我separate
運行時,我收到警告並且 output 不正確:
#Warning message:
#Expected 2 pieces. Additional pieces discarded in 10 rows [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].
#> df3
# a b
#1 Y3
#2 D4.6
#3 G5
#4 A3.4
#5 B5.5
#6 W4.6
#7 K4.6
#8 N4.3
#9 R5.1
#10 S3.4
用於“a”列的內容已放在“b”列,而用於“b”的內容似乎已完全刪除。
另一種選擇是從一開始就制作更精確的正則表達式。
例如
df1 |>
separate(col = ab,
into = c("a", "b"),
sep = "(?<=\\d)(?=[[:upper:]])")
Output:
a b
1 B1.8 Z4.3
2 M5 U6.7
3 N5 Q5.1
4 V4.9 B6.5
5 N4 V1.2
6 H2.8 J5.1
7 Q3.6 J1.3
8 J3.8 G2.9
9 B1.2 W4.7
10 L1.6 O3.5
這是因為您在第一個字母之前創建了一個空格:要刪除它,您可以使用trimws
或str_trim
:
df1 %>%
mutate(ab = trimws(gsub('([[:upper:]])', ' \\1', ab))) %>%
separate(col=ab, into=c("a", "b"), sep = " ")
a b
1 Y3 A5.3
2 D4.6 U2.4
3 G5 U4.2
4 A3.4 J2.9
5 B5.5 V4.4
6 W4.6 N1.5
7 K4.6 J1.9
8 N4.3 G5.1
9 R5.1 I4.7
10 S3.4 O5.6
后來我發現行號被包含為一列,我可以通過確認和刪除“n”列來解決這個問題:
df3 <- df2 %>% separate(col=ab, into=c("n", "a", "b"), sep = " ") %>%
select(-n)
df3
但是,這很冗長,而且我看不到任何以前的文獻或文檔在separate
的 . 我是否遺漏了什么,是否有更簡潔的方法來防止這種行為?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.