【发布时间】:2017-05-08 16:32:46
【问题描述】:
在 R 项目中,我想从数据框中提取字符串,其中列类似于
"A|B|C"
"B|Z"
"I|P"
...
我想要一个带有A B C Z I P 列的新数据框
我想用 for 和 gsub 来实现,但这并不容易,因为模式提取了 |,我不确定这是否是完成此类任务的最佳和优雅的方式
【问题讨论】:
在 R 项目中,我想从数据框中提取字符串,其中列类似于
"A|B|C"
"B|Z"
"I|P"
...
我想要一个带有A B C Z I P 列的新数据框
我想用 for 和 gsub 来实现,但这并不容易,因为模式提取了 |,我不确定这是否是完成此类任务的最佳和优雅的方式
【问题讨论】:
从数据帧 df 开始,使用基础 R,我们可以尝试以下操作:
data.frame(col=unique(unlist(strsplit(as.character(df$col), split='\\|'))))
# col
#1 A
#2 B
#3 C
#4 Z
#5 I
#6 P
或使用 dplyr
df %>%
mutate(col = strsplit(col, "\\|")) %>%
unnest(col) %>% unique
# col
# (chr)
#1 A
#2 B
#3 C
#4 Z
#5 I
#6 P
数据
df <- data.frame(col=c("A|B|C",
"B|Z",
"I|P"), stringsAsFactors = FALSE)
如果您希望它们成为列的名称,请尝试以下操作:
symbols <- unique(unlist(strsplit(as.character(df$col), split='\\|')))
df <- data.frame(matrix(vector(), 0, length(symbols),
dimnames=list(c(), symbols)), stringsAsFactors=F)
df
#[1] A B C Z I P
#<0 rows> (or 0-length row.names)
【讨论】:
带有文本参数输入的scan 函数似乎适合此任务:
st <- c("A|B|C","B|Z","I|P")
scan(text=st, what="", sep="|")
Read 7 items
[1] "A" "B" "C" "B" "Z" "I" "P"
从您的问题描述或示例中,我不清楚您希望如何将其与原始 3 行数据框对齐。
【讨论】:
我们可以使用cSplit
library(splitstackshape)
unique(cSplit(df1, "V1", "|", "long"), by = "V1")
df1 <- data.frame(V1 = c("A|B|C","B|Z","I|P"))
【讨论】:
结合 strsplit,unlist 和 unique 你可以:
#Steps:
#1) split each element of column with separator as "|"
#2) combine output for all items with unlist
#3) retain unique elements of those
vec = c("A|B|C","B|Z","I|P")
newDF = data.frame(newCol = unique(unlist(lapply(vec,function(x) unlist(strsplit(x,"[|]")) ))),
stringsAsFactors = FALSE)
newDF$newCol
#[1] "A" "B" "C" "Z" "I" "P"
【讨论】:
unique(scan(textConnection(vec), 'character', sep = '|'))
data.frame(char = unique(unlist(strsplit(vec, "|", fixed = TRUE))))