r - 在数据框的行中,找到第一个出现和最长的值序列
问题描述
考虑这个数据框,它提供了对 10 个人的 15 项测试的评分响应:
library(tidyverse)
input <- tribble(
~ID, ~i1, ~i2, ~i3, ~i4, ~i5, ~i6, ~i7, ~i8, ~i9, ~i10, ~i11, ~i12, ~i13, ~i14, ~i15,
"A", 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
"B", 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
"C", 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
"D", 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0,
"E", 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
"F", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
"G", 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
"H", 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,
"I", 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
"J", 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1
)
我希望 R 逐行扫描,并从左到右扫描每行中的单元格,以创建这些新列:
first_0_name
:返回包含第一次出现的值的单元格的列名0
first_0_loc
:返回包含第一次出现的值的单元格的列位置0
streak_1
:从第一次出现的开始0
,找出下一次出现的次数1
,然后计算1
下一次出现前连续出现的次数0
。
新列应如下所示
new_cols <- tribble(
~first_0_name, ~first_0_loc, ~streak_1,
"i9", 10, 5,
"i4", 5, 4,
"i6", 7, 8,
"i8", 9, 4,
"i9", 10, 5,
NA, NA, NA,
"i1", 2, 5,
"i3", 4, 8,
"i2", 3, NA,
"i1", 2, 1
)
提前感谢您的帮助!
解决方案
如果您想更直接地使用 base R 并避免转换整个数据框的成本。此解决方案还保留了行的顺序,而无需创建额外的排序列(与 tidyverse 解决方案不同)。
results <- apply(input, 1, function(x) {
# get indices of all zeros
zeros <- which(x == 0)
# exit early if no zeros are found
if (length(zeros) == 0) {
return(data.frame(first_0_name = NA, first_0_loc = NA, streak_1 = NA))
}
first.name <- names(zeros[1]) # name of first 0 column
first.idx <- zeros[1] # location of first zero
longest.streak <- diff(zeros)[1] - 1 # length of first 0-0 streak
return(data.frame(first_0_name = first.name,
first_0_loc = first.idx,
streak_1 = ifelse(longest.streak == 0, NA, longest.streak))
)
})
output <- do.call(rbind, results)
first_0_name first_0_loc streak_1
i9 i9 10 5
i4 i4 5 4
i6 i6 7 8
i8 i8 9 NA
i91 i9 10 5
1 <NA> NA NA
i1 i1 2 5
i3 i3 4 8
i2 i2 3 NA
i31 i3 4 2
推荐阅读
- r - 在带有管道函数的向量中应用 is.na() 函数
- ios - 编辑 UILable,隐藏 inputAccessoryView [swift 5]
- angular - Angular Mat-Slide-Toggle 响应缓慢
- python - 试图从 yelp 中获取线索
- haskell - Haskell 使用索引从字符串矩阵递归地将数据元素添加到矩阵
- r - 使用 rtweet 从推文中获取媒体
- dojo - 在 WCM 中隐藏 Dojo 对话框
- drop-down-menu - 使用 Angular 6+ 表单数组复制动态选择框
- python - 在 Alexa 开发者控制台中使用 beautifulsoup4
- css - 通过 CSS 获取页眉和页脚高度