将数据框的一列拆分为多列但不重复

时间:2017-08-09 03:36:45

标签: r split

我想基于分隔符在数据帧中将一列拆分为两列。例如,

METHAMPHETAMINE | MORPHINE
THC

成为

METHAMPHETAMINE  MORPHINE
THC

在数据框内。

谢谢!

2 个答案:

答案 0 :(得分:1)

一种选择是使用gsub()识别并提取单列中垂直管道的任一侧:

df <- data.frame(col=c('METHAMPHETAMINE | MORPHINE', 'THC'))
df$col1 <- gsub("(.*)\\s*\\|.*", "\\1", df$col)
df$col2 <- ifelse(grepl(".*\\|\\s*(.*)", df$col),
                  gsub(".*\\|\\s*(.*)", "\\1", df$col), 
                  "")

df
                         col             col1      col2
1 METHAMPHETAMINE | MORPHINE  METHAMPHETAMINE  MORPHINE
2                        THC              THC

Demo

你的问题是一个曲线球,因为根据你的样本数据,我们可以看到数据框中的每一行都不会有一个带有第二列的管道。当找不到匹配项时,返回输入字符串是gsub()的一个特性,但在我们的例子中,如果没有管道,我们只需要空字符串。这里的一个选择是使用grepl()来首先检查模式是否匹配,如果不匹配,则返回空字符串。

可能是this question的副本,但是在那里给出答案的新应用将需要回答你的问题。

答案 1 :(得分:0)

> a1=read.csv("test.csv",header=F)
> a1
                          V1
1 METHAMPHETAMINE | MORPHINE
2                        THC


> within(a1, FOO<-data.frame(do.call('rbind', strsplit(as.character(V1), '|', fixed=TRUE))))
                          V1           FOO.X1    FOO.X2
1 METHAMPHETAMINE | MORPHINE METHAMPHETAMINE   MORPHINE
2                        THC              THC       THC

Split column at delimiter in data frame