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
答案 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