根据列中的字符串拆分表

时间:2013-12-09 13:03:56

标签: r string

这应该是一个简单的,但我找不到有效的解决方案,同时又优雅......

我有一个表,在一列中有一个字符串。一些字符串以字母“E”开头,而其他字符串以字母“B”开头。如何生成两个表,其中第一个表只包含字符串以“E”开头的行,第二行表示字符串以“B”开头?

编辑:

示例:

Col1 Col2 StringCol Col4
1    1    Bacteria  3.2
2    3    Eukaryote 1.0
4    1    Bacteria  1.5
0    2    Bacteria  1.2
2    0    Eukaryote 0.9

现在数据框应该分成两个框架,一个框架的所有行都是“Bacteria”,另一个框架的所有行都是“Eukaryote”。

3 个答案:

答案 0 :(得分:2)

您始终可以使用grepl进行字符串匹配。因此,一个选项

# Some sampledata:
yourdata <- data.frame(id=1:5, stringcol=c("bus", "easter", "Bunny", "nothing", "End"))

subset(yourdata, grepl("^B", stringcol)) 
# ^ marks the beginning of a string, then followed by "B"

# For E:
subset(yourdata, grepl("^E", stringcol)) 

如果您希望匹配不区分大小写,则可以执行

subset(yourdata, grepl("^[Bb]", stringcol)) 

完全不同的方法是使用

subset(yourdata, substring(stringcol, 1, 1) == 'B') 
# substring(..., 1, 1) extracts just the first letter from your string.

编辑:

如果你知道整个字符串,你可以随时做最优雅的版本:

subset(yourdata, stringcol == 'Bacteria')

答案 1 :(得分:1)

试试这个:

#reproducible data
df <- read.table(text="Col1 Col2 StringCol Col4
1    1    Bacteria  3.2
2    3    Eukaryote 1.0
4    1    Bacteria  1.5
0    2    Bacteria  1.2
2    0    Eukaryote 0.9", header=TRUE)

#subset
df_B <- df[ substr(df$StringCol,1,1)=="B", ]
df_E <- df[ substr(df$StringCol,1,1)=="E", ]

答案 2 :(得分:0)

您要查找的功能位于问题标题中:split

split(mydf, grepl("^Eu", mydf$StringCol))
# $`FALSE`
#   Col1 Col2 StringCol Col4
# 1    1    1  Bacteria  3.2
# 3    4    1  Bacteria  1.5
# 4    0    2  Bacteria  1.2
# 
# $`TRUE`
#   Col1 Col2 StringCol Col4
# 2    2    3 Eukaryote  1.0
# 5    2    0 Eukaryote  0.9