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
如何将由制表符或 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