具有列表项的数据帧,我们正在检查该DF中每行中是否存在值

时间:2017-10-11 13:44:41

标签: r dplyr

我有这个数据框:

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方式。

1 个答案:

答案 0 :(得分:0)

使用dplyrpurrr的组合,您可以尝试:

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”。