我的数据示例如下:
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)
我得到一个错误。我已进行搜索以找出错误,但失败了。
答案 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