根据符号

时间:2019-04-25 13:08:41

标签: r string split

我在数据框中有一列,其中包含四位数(例如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))

1 个答案:

答案 0 :(得分:2)

您可以使用tidyrdplyr进行此操作,首先在/上拆分数据,然后使用第一个元素和第二个元素的长度将它们分组为{{ 1}},four_digit_afive_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,因此,如果要使用“数字”)