将数据框的列拆分为多个列
我想收集表格的数据
before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))
attr type
1 1 foo_and_bar
2 30 foo_and_bar_2
3 4 foo_and_bar
4 6 foo_and_bar_2
并在上面的“ type
”列上使用split()
来得到如下所示的结果:
attr type_1 type_2
1 1 foo bar
2 30 foo bar_2
3 4 foo bar
4 6 foo bar_2
我想出了一些令人难以置信的复杂的事情,涉及某种形式的apply
,但我从那以后错过了。 要成为最好的方式似乎太复杂了。 我可以像下面那样使用strsplit
,但是不清楚如何将它重新分成数据框中的2列。
> strsplit(as.character(before$type),'_and_')
[[1]]
[1] "foo" "bar"
[[2]]
[1] "foo" "bar_2"
[[3]]
[1] "foo" "bar"
[[4]]
[1] "foo" "bar_2"
感谢任何指针。 我还没有完全掌握R列表。
使用stringr::str_split_fixed
library(stringr)
str_split_fixed(before$type, "_and_", 2)
另一种选择是使用新的tidyr软件包。
library(dplyr)
library(tidyr)
before <- data.frame(
attr = c(1, 30 ,4 ,6 ),
type = c('foo_and_bar', 'foo_and_bar_2')
)
before %>%
separate(type, c("foo", "bar"), "_and_")
## attr foo bar
## 1 1 foo bar
## 2 30 foo bar_2
## 3 4 foo bar
## 4 6 foo bar_2
5年后添加强制data.table
解决方案
library(data.table) ## v 1.9.6+
setDT(before)[, paste0("type", 1:2) := tstrsplit(type, "_and_")]
before
# attr type type1 type2
# 1: 1 foo_and_bar foo bar
# 2: 30 foo_and_bar_2 foo bar_2
# 3: 4 foo_and_bar foo bar
# 4: 6 foo_and_bar_2 foo bar_2
我们也可以通过添加type.convert
和fixed
参数来确保结果列具有正确的类型并提高性能(因为"_and_"
不是真正的正则表达式)
setDT(before)[, paste0("type", 1:2) := tstrsplit(type, "_and_", type.convert = TRUE, fixed = TRUE)]
链接地址: http://www.djcxy.com/p/70905.html
上一篇: Split a column of a data frame to multiple columns
下一篇: R list to data frame