我在数据框中有一列,其中包含四位数(例如4567),五位数(19282),四和五位数之间用斜杠分隔的数字(例如16726/2625或8728/16292 )或两个以斜杠分隔的五位数(例如37647/38838)。我想将此列中的值拆分为仅包含四位数,前五位数或后五位数的不同列。
我曾经尝试过用stringplit做它,但是我没有成功
这就是我所拥有的:
da <-data.frame(x=c("12345/6789","9876", "23456", "75648/38292", "3456", "98765/1234", "6543", "67898"))
这就是我需要的:
db <-data.frame(x=c("12345/6789","9876", "23456", "75648/38292", "3456", "98765/1234", "6543", "67898"), four_digit_a=c(6789, 9876, NA, NA, 3456, 1234,6543, NA), five_digit_a=c(12345,NA, 23456,75648, NA, 98765, NA, 67898), five_digit_b=c(NA, NA, NA, 38292, NA, NA, NA, NA))
答案 0 :(得分:2)
您可以使用tidyr
和dplyr
进行此操作,首先在/
上拆分数据,然后使用第一个元素和第二个元素的长度将它们分组为{{ 1}},four_digit_a
或five_digit_a
。
five_digit_b
哪个会给你:
library(tidyr)
library(dplyr)
df <-data.frame(x=c("12345/6789","9876", "23456", "75648/38292", "3456", "98765/1234", "6543", "67898")) %>%
separate(x, into = c('first','second'), sep = '/') %>%
rowwise() %>%
mutate(four_digit_a = ifelse(nchar(first) == 4, first, NA)) %>%
mutate(five_digit_a = ifelse(nchar(first) == 5, first, NA)) %>%
mutate(five_digit_b = ifelse(nchar(second) == 5, second, NA))
(请注意,由于输入数据为 first second four_digit_a five_digit_a five_digit_b
<chr> <chr> <chr> <chr> <chr>
1 12345 6789 NA 12345 NA
2 9876 NA 9876 NA NA
3 23456 NA NA 23456 NA
4 75648 38292 NA 75648 38292
5 3456 NA 3456 NA NA
6 98765 1234 NA 98765 NA
7 6543 NA 6543 NA NA
8 67898 NA NA 67898 NA
,这些数字现在是character
而不是numeric
,因此,如果要使用“数字”)