R——将制表符分隔的字符串转换为长格式

R -- transform tab delimited string to long format

如何将由制表符或 space 分隔的字符串重新整形为长格式?字符串(这里称为 label)可以有不同的长度。

我有这个

    var       label
1  work     100 101
2 sleep 500 409 200

我想要这个

    var code
1  work  100
2  work  101
3 sleep  500
4 sleep  409
5 sleep  200


# data 
df = data.frame(var = c("work", 'sleep'), label = c('100 101', '500 409 200'))
library(tidyr)
df %>% 
    separate_rows(label)
# A tibble: 5 x 2
  var   label
  <chr> <chr>
1 work  100  
2 work  101  
3 sleep 500  
4 sleep 409  
5 sleep 200 

已经发布了一个很好的答案。但是假设你有一个奇怪的分隔符,像这样:

df = data.frame(var = c("work", 'sleep'), label = c('100-gh-101', '500-gh-409-gh-200'))

在这种情况下,您可以使用正则表达式和 unnest():

df %>% 
  mutate(label2 = strsplit(label, "-gh-")) %>% 
  unnest(label2)

  var   label             label2
  <chr> <chr>             <chr> 
1 work  100--101          100   
2 work  100--101          101   
3 sleep 500-gh-409-gh-200 500   
4 sleep 500-gh-409-gh-200 409   
5 sleep 500-gh-409-gh-200 200 

Map

中使用strsplit
Map(cbind, df$var, strsplit(df$label, ' ')) |> do.call(what=rbind.data.frame)
#            V1  V2
# work.1   work 100
# work.2   work 101
# sleep.1 sleep 500
# sleep.2 sleep 409
# sleep.3 sleep 200

by.

by(df, rev(df$var), \(x) with(x, cbind(var, code=el(strsplit(label, split=' '))))) |>
  do.call(what=rbind.data.frame) 
#           var code
# sleep.1  work  100
# sleep.2  work  101
# work.1  sleep  500
# work.2  sleep  409
# work.3  sleep  200