【问题标题】:R If a data.frame variable contains a vector, how to operate/filter on the vector?R如果data.frame变量包含一个向量,如何对向量进行操作/过滤?
【发布时间】:2021-01-24 19:13:06
【问题描述】:

原始示例代码:

v1 = c('Tom','Dick','Harry')
d1 <- data.frame(v1)

l1 <- c('20200101','20200202','20200303')
l2 <- c('20200101','20200202')
l3 <- c('20200101','20200202','20200303','20200404')
v2 = c(l1,l2,l3)
d1$v2 = v2
d2 <- d1

d2$len_v2 = c(3,2,4)

修正了解决 Q1 问题的示例代码。问题是我没有传入列表列表。

v2 = c(l1,l2,l3) 将列表列表展平并导致错误:

library(tidyverse)
v1 <- c('Tom','Dick','Harry')
d1 <- data.frame(v1)

l1 <- c('20200101','20200202','20200303')
l2 <- c('20200101','20200202')
l3 <- c('20200101','20200202','20200303','20200404')
v2 <- list(l1,l2,l3)
d1$v2 <- v2
d2 <- d1 %>% mutate(len_v2 = lengths(v2))

我通常使用 tidyverse。

Q1 >> 如何计算 'len_v2' 作为 D1 中的变量?是否有按行操作来执行此操作?

A1 >> 已解决。

Q2 >> 有没有办法对 v2 变量中的列表应用操作,例如过滤,或者产生一个新的列表变量,或者删除没有通过 v2 列表变量条件的行?

例如,如果我想返回其中包含 20200303 的所有行以获得仅包含第一行和第三行的结果 d3?

谢谢!

【问题讨论】:

    标签: r vector tidyverse rowwise


    【解决方案1】:

    如果是list列,那么我们可以使用lengths

    library(dplyr)
    d2 %>%
       mutate(len_v2 = lengths(v2))
    

    -输出

    #    v1                                     v2 len_v2
    #1   Tom           20200101, 20200202, 20200303      3
    #2  Dick                     20200101, 20200202      2
    #3 Harry 20200101, 20200202, 20200303, 20200404      4
    

    对于filtering,可以使用map循环遍历list,应用逻辑表达式并将逻辑向量返回给filter

    library(purrr)
    d2 %>%
        filter(map_lgl(v2, ~ '20200303' %in% .x))
    
    #     v1                                     v2 len_v2
    #1   Tom           20200101, 20200202, 20200303      3
    #2 Harry 20200101, 20200202, 20200303, 20200404      4
    

    假设

    v2 <- list(l1,l2,l3)
    

    在 OP 的代码中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2023-04-04
      • 2014-05-18
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多