分离混合值并在tidyverse中生成新列

时间:2019-06-15 18:02:14

标签: r tidyverse

我的数据示例如下:

df1 <- read.table(text = "var Time  
 12O    12
13O 11
22B 45
33Z 22
21L 2
11M 13", header = TRUE)

我想分隔“ Var”列中的值以获取以下数据:

df2 <- read.table(text = " Group1 Group2 Group3 
 1  2   O
1   3   O
2   2   B
3   3   Z
2   1   L
1   1   M", header = TRUE)

我尝试了以下代码:

 df2 <- df1 %>% separate(var, into = c('Group1', 'Group2','Group3'), sep = 1)

我得到一个错误。我已进行搜索以找出错误,但失败了。

3 个答案:

答案 0 :(得分:1)

(Separate outputs empty separator error for each row independently)而言,getDate :: IO Day getDate = do now <- getCurrentTime tz <- getCurrentTimeZone return . localDay $ utcToLocalTime tz now main = do d2 <- getDate return $ fromGregorian 2019 6 15 == d2 tidyr无法做到。可能是separate()的{​​{1}}或str_split()的{​​{1}}。

因此,使用stringr

strsplit()

使用base R

str_split()

要创建具有适当类(字符,整数等)的新列,可以将df1 %>% mutate(var = str_split(var, pattern = "")) %>% unnest() %>% group_by(Time) %>% mutate(val = var, var = paste0("Group", row_number())) %>% spread(var, val) %>% ungroup() Time Group1 Group2 Group3 <int> <chr> <chr> <chr> 1 2 2 1 L 2 11 1 3 O 3 12 1 2 O 4 13 1 1 M 5 22 3 3 Z 6 45 2 2 B 添加到strsplit()中。

答案 1 :(得分:1)

可能的base/stringr解决方案:

res<-as.data.frame(do.call(rbind,strsplit(stringr::str_replace_all(df1$var
 ,"([0-9])([0-9])([A-Z])","\\1 \\2 \\3"),
          " ")))
 names(res)<-paste0("Group",1:ncol(res))


 cbind(df1["Time"],res)
  Time Group1 Group2 Group3
1   12      1      2      O
2   11      1      3      O
3   45      2      2      B
4   22      3      3      Z
5    2      2      1      L
6   13      1      1      M

答案 2 :(得分:1)

如果您想保留原始列,则可以使用str_split_fixed包中的stringr并将结果cbind保留到现有的dataframe

cbind(df1, str_split_fixed(as.character(df1$var),"", n = 3))

  var Time 1 2 3
1 12O   12 1 2 O
2 13O   11 1 3 O
3 22B   45 2 2 B
4 33Z   22 3 3 Z
5 21L    2 2 1 L
6 11M   13 1 1 M