我有这个数据框:
df = structure(list(session_id = 1:14, rv = list(c(1, 2, 3), 4, c(5,
6), c(7, 8), 5, c(9, 6, 10, 10), c(9, 6), c(11, 9, 12, 13), c(8,
3, 9), 3, 14, c(13, 11, 15), c(6, 6), 16)), row.names = c(NA,
14L), vars = list(session_id), drop = TRUE, .Names = c("session_id",
"rv"), class = c("rowwise_df", "tbl_df", "tbl", "data.frame"))
现在我想检查在会话ID分组的rv列中是否存在值9。 例如。检查第一行rv [[1]] 9不存在返回0。第二行rv [[2]] 9的检查不存在....在第6行rv [[6]] 9存在所以返回其索引位置1 ...同样在第9行rv [[9]] 9出现在第3个索引返回它.......所以想法是如果值9存在于rv返回索引位置,则返回0。
我希望这足以说明这个想法是什么。
寻找dplyr方式。
答案 0 :(得分:0)
使用dplyr
和purrr
的组合,您可以尝试:
df %>% ungroup() %>%
mutate(index = map_int(rv, function(l) if_else(any(l == 9), which.max(l == 9), 0L)))
# A tibble: 14 x 3
session_id rv index
<int> <list> <int>
1 1 <dbl [3]> 0
2 2 <dbl [1]> 0
3 3 <dbl [2]> 0
4 4 <dbl [2]> 0
5 5 <dbl [1]> 0
6 6 <dbl [4]> 1
7 7 <dbl [2]> 1
8 8 <dbl [4]> 2
9 9 <dbl [3]> 3
10 10 <dbl [1]> 0
11 11 <dbl [1]> 0
12 12 <dbl [3]> 0
13 13 <dbl [2]> 0
14 14 <dbl [1]> 0
这里我使用map_int
,因为输入是一个列表,你想要一个整数作为输出。
如果其中一个向量中有多个9,则返回第一个索引。
我必须使用ungroup
作为您的data.frame是“rowwise_df”。