在列表列中获取每一行的列表的第一个元素。

4
如何消除嵌套列表,只保留 ColumnB 中每个列表的第一个元素?
ColumnA ColumnB
first c(1, 2, 3)
second c(4, 5, 6)
third c(7, 8, 9)
它应该看起来像这样:
ColumnA ColumnB
first 1
second 4
third 7
中,我会尝试使用lambda函数仅获取列表的第一个元素。
3个回答

4
我们可以使用map循环遍历list列并提取first元素。
library(dplyr)
library(purrr)
df1 %>%
    mutate(ColumnB = map_dbl(ColumnB, first))

-输出

# A tibble: 3 × 2
  ColumnA ColumnB
  <chr>     <dbl>
1 first         1
2 second        4
3 third         7

base R中,可以使用sapply来循环遍历list并提取第一个元素。
df1$ColumnB <- sapply(df1$ColumnB, `[`, 1)

数据

df1 <- structure(list(ColumnA = c("first", "second", "third"), ColumnB = list(
    c(1, 2, 3), c(4, 5, 6), c(7, 8, 9))), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -3L))

谢谢您的快速回复。如果列表元素是字符而不是整数,我能以同样的方式做吗? - Propostus
@Propostus,你可以使用map_chr代替map_dbl。(_chr)返回的是一个具有类类型的向量。或者,如果您不知道列的类型,也可以使用unlist(map(ColumnB, first)) - akrun

3

如果您的ColumnB是一个真正的列表,那么我们也可以这样做:

library(tidyr)
library(dplyr)

df1 %>% 
  unnest(ColumnB) %>% 
  group_by(ColumnA) %>% 
  slice(1)

  ColumnA ColumnB
  <chr>     <dbl>
1 first         1
2 second        4
3 third         7

如果您的ColumnB是字符串,则我们可以这样做:

library(dplyr)
library(readr)
df %>% 
  mutate(ColumnB = parse_number(ColumnB))

  ColumnA ColumnB
1   first       1
2  second       4
3   third       7

3

这里是另一种仅使用 dplyr 的方法:

library(dplyr)

df1 %>% 
  rowwise() %>% 
  mutate(ColumnB = ColumnB[1]) %>%
  ungroup()

#> # A tibble: 3 x 2
#>   ColumnA ColumnB
#>   <chr>     <dbl>
#> 1 first         1
#> 2 second        4
#> 3 third         7

1
rowwise() 的有趣效果。之前不知道这个!感谢分享。 - TarJae

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