1

我曾经摆弄 R,现在这一切似乎都逃脱了我。. .

我有一个有几百列和大约 100k 行的表。其中一列包含有时包含逗号的字符串(例如,鸡、山羊、牛或只是鸡)。我需要一个带有(我相信)for循环的脚本,它可以创建一个新列(我知道新列代码不应该在for循环中),计算逗号的数量(或相关列中的条目数)少一个)并添加一个,这样我就可以找出每列中有多少条目。一个例子:

col
chicken
chicken,goat
cow,chicken,goat
cow

我想要一个脚本来在表中创建一个看起来像的附加列。. .

col2
1
2
3
1
4

3 回答 3

7

我会使用count.fields(来自base R):

mydf$col2 <- count.fields(file = textConnection(as.character(mydf$col)), 
                          sep = ",")
mydf
#                col col2
# 1          chicken    1
# 2     chicken,goat    2
# 3 cow,chicken,goat    3
# 4              cow    1

更新:占空行

count.fields有一个合乎逻辑的论点blank.lines.skip。因此,要捕获空行的信息,只需将其设置为TRUE.

例子:

mydf <- data.frame(col = c("chicken", "", "chicken,goat", "cow,chicken,goat", "cow"))

count.fields(file = textConnection(as.character(mydf$col)), 
             sep = ",", blank.lines.skip=FALSE)
# [1] 1 0 2 3 1
于 2013-09-18T20:06:39.610 回答
2

我认为这里不需要循环。使用stringr包...

require(stringr)
dat$aninum <- sapply(dat$ani,str_count,pattern=',')+1

这使

               ani aninum
1          chicken      1
2     chicken,goat      2
3 cow,chicken,goat      3
4              cow      1
于 2013-09-18T20:04:48.350 回答
0

你可以使用?strsplit

df <- data.frame(col=c("chicken", "chicken,goat", "cow,chicken,goat", "cow"), stringsAsFactors=FALSE)
df$col2 <- sapply(strsplit(df$col, ","), length)
df
#                col col2
# 1          chicken    1
# 2     chicken,goat    2
# 3 cow,chicken,goat    3
# 4              cow    1
于 2013-09-18T20:06:59.790 回答