如何使R计算数据帧中元素的字符数?

时间:2018-06-20 19:04:20

标签: r

structure(list(Switch = c("4", "3"), `1` = c("1, 2, 3, 4", 
NA), `2` = c("1, 2, 3, 4", NA), `3` = c("1, 2, 3, 4, 6, 7", 
NA), `4` = c("1, 2, 3, 4, 5, 6", NA), `5` = c("1, 2, 3, 4", 
"1"), `6` = c("1, 2, 3, 4", NA
)), .Names = c("Switch", "1", "2", "3", "4", "5", 
"6"), row.names = 1:2, class = "data.frame")

给出上述数据框。我想让R计算每个元素中有多少个数字(用逗号分隔)。例如,包含列表1, 2, 3, 4的元素包含4个数字。

我希望R计算转换年份之前(第1列)和转换年份之后每行有多少总数。

以第一行为例;转换年份为4,在第1年中有4个不同的数字,在第2年中有4个,而第3年有6个。因此,R在新列中将总数加为4 + 4 + 6 = 14。然后,它与转换年份之后的年份(第5年和第6年)相同,并在第二个新列中输出总计。

在我的一项搜索中,建议在stri_extract_all_regex包中使用函数stringi,但是我只能让它在一年内工作一年,而且似乎也算上{ {1}}的值,也不应该。

预期的输出由以下代码给出:

NA

2 个答案:

答案 0 :(得分:1)

另一个stringi解决方案:

library(stringi)

df[c("before","after")] <-
  t(apply(df,1,function(x) {
    counts <- stri_count_words(x[-1])
    x <- as.numeric(x[1])
    c(sum(head(counts,x-1),na.rm=TRUE),
      sum(tail(counts ,-x),na.rm=TRUE))
  }))

#   Switch          1          2                3                4          5          6 before after
# 1      4 1, 2, 3, 4 1, 2, 3, 4 1, 2, 3, 4, 6, 7 1, 2, 3, 4, 5, 6 1, 2, 3, 4 1, 2, 3, 4     14     8
# 2      3       <NA>       <NA>             <NA>             <NA>          1       <NA>      0     1

答案 1 :(得分:0)

library(stringi)

df2 <- df
# Count words and coerce to numeric
df2[-1] <- lapply(df2[-1], stri_count_words)
df2[1]  <- lapply(df2[1], as.numeric)
# For each row, sum the number of words before (part1) and after (part2)
newcols <- 
apply(t(df2), 2, function(x){ 
  part1 <- x[-1][1:(x[1] - 1)]
  part2 <- x[-1][-(1:x[1])]
  list(before = sum(part1, na.rm = T),
       after  = sum(part2, na.rm = T))})


cbind(df, do.call(rbind, newcols))


#   Switch          1          2                3                4          5          6
# 1      4 1, 2, 3, 4 1, 2, 3, 4 1, 2, 3, 4, 6, 7 1, 2, 3, 4, 5, 6 1, 2, 3, 4 1, 2, 3, 4
# 2      3       <NA>       <NA>             <NA>             <NA>          1       <NA>
#   before after
# 1     14     8
# 2      0     1