答案 0 :(得分:2)
我们可以尝试
nchar(gsub('[^,]+', '', gsub(',(?=,)|(^,|,$)', '',
gsub('(Null){1,}', '', df1$subcat_id), perl=TRUE)))+1L
#[1] 6 4
或者
library(stringr)
str_count(df1$subcat_id, '[0-9.]+')
#[1] 6 4
df1 <- data.frame(subcat_id = c('1,2,3,15,16,78',
'1,2,3,15,Null,Null'), stringsAsFactors=FALSE)
答案 1 :(得分:1)
你可以做到
sapply(strsplit(subcat_id,","),FUN=function(x){length(x[x!="Null"])})
strsplit(subcat_id,",")
将返回逗号分区中 subcat_id 中每个项目的列表。 sapply
会将指定的函数应用于此列表中的每个项目,并返回结果的向量。
最后,我们应用的函数将只接受每个列表项中的非空条目,并计算生成的子列表。
例如,如果我们有
subcat_id <- c("1,2,3","23,Null,4")
然后运行上面的代码会返回c(3,4)
,您可以将其分配给列。
<小时/> 如果从数据帧运行此字符,则可能已将字符列解释为因子,在这种情况下,将抛出错误非字符参数。要解决这个问题,我们需要强制解释为
as.character
函数的字符向量,将命令更改为
sapply(strsplit(as.character(frame$subcat_id),","),FUN=function(x){length(x[x!="Null"])})