这应该是一个简单的,但我找不到有效的解决方案,同时又优雅......
我有一个表,在一列中有一个字符串。一些字符串以字母“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”。
答案 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