如何索引列表的第一个元素,并将其应用于R中数据框的每一行?

3

我有一列包含日期元素的列表对象,我想选择第一个日期并将其变异为新列,但现在我遇到了一些索引问题。

我已经尝试对列表进行索引,但它不适用于每一行,而总是显示第一行的第一个元素。 以下是代码:

> head(data$Date)
[[1]]
 [1] "2016-06-08" "2016-06-08" "2016-06-13" "2016-06-13" "2016-06-13" "2016-06-14"
 [7] "2016-06-14" "2016-06-14" "2016-06-14" "2016-06-14" "2016-06-14" "2016-09-15"
[13] "2016-10-31"

[[2]]
[1] "2016-10-02"

[[3]]
[1] "2016-09-25"

[[4]]
[1] "2017-02-16"

> data %>%
+     mutate(time1 = Date[[1]][1])%>%
+     select(time1)
# A tibble: 29,036 x 1
   time1     
   <chr>     
 1 2016-06-08
 2 2016-06-08
 3 2016-06-08
 4 2016-06-08
 5 2016-06-08
 6 2016-06-08
4个回答

5
我们也可以使用带有reduce的pluck,以确保日期不会被强制转换为数字。
library(tidyverse)
data %>%
    mutate(time1 =  map(Date, pluck, 1) %>%
                       reduce(c))

如果我们需要最后一个,就使用pluck来获取最后一个。
data %>%
   mutate(time1 = map(Date, pluck, last) %>% 
                    reduce(c))

请问您能解释一下 c 的含义吗? - Bathe
@Bathe c 代表连接。它会将两个元素、向量、列表等拼接在一起,创建成一个单独的向量/列表等。你可以检查 c(1, 2) - akrun
@ Bathe 我更新了一个选项,可以提取最后一个元素。 - akrun
非常感谢,它起作用了。顺便问一下,你能推荐一些学习purrr包的资料吗? - Bathe
@Bathe 你可以从这里查看文档和其他材料。 - akrun

1
< p > tidyr 中的 unnest_wider() 对我非常有用

data %>%
tidyr::unnest_wider(col = Date ) %>% 
  select(1, Date = 2)

对于列表中的每个元素(第二个及后续元素添加新行),只需使用unnest()

data %>%
tidyr::unnest(cols = Date)

0

尝试使用tidyverse包中的purrr函数中的map函数:

data %>%
  mutate(time1 = map(Date, ~ .[[1]]) %>% unlist()) %>% 
  select(time1)

map()函数将提取每个列表元素的第一个元素。由于map默认返回一个列表,因此您需要使用unlist()将输出放置在您想要的列中。


非常感谢,那么如何提取最后一个元素?R似乎没有提供像[-1]这样的索引来引用最后一个元素。 - Bathe

0

只使用dplyr的另一种选择是仅使用rowwise()函数,它在每行中单独应用mutate函数。

library(dplyr)

iris %>%
  group_by(Species) %>%
  summarise(petals = list(Petal.Length)) %>%
  rowwise() %>%
  mutate(first = first(petals), last = last(petals))
#> # A tibble: 3 × 4
#> # Rowwise: 
#>   Species    petals     first  last
#>   <fct>      <list>     <dbl> <dbl>
#> 1 setosa     <dbl [50]>   1.4   1.4
#> 2 versicolor <dbl [50]>   4.7   4.1
#> 3 virginica  <dbl [50]>   6     5.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接