【问题标题】:Create a vector of inclusive numbers in a dataframe in R在 R 的数据框中创建一个包含数字的向量
【发布时间】:2019-05-28 22:46:28
【问题描述】:

可重现的数据:

Start_Curr_Job <- c(2009, 2011, 2014)
End_Curr_Job <- c(2012, 2015, 2019)
data_clean <- data.frame(Start_Curr_Job, End_Curr_Job)

我有一个包含“startyear”和“endyear”列的数据框。我正在尝试创建第三列,其中将包含其间所有年份的包容性列表,但我下面的代码无法正常工作。

例如,对于 startyear = 2009 和 endyear = 2012,allyears 应该等于 2009、2010、2011、2012。

任何建议将不胜感激。我的代码如下:

data_clean <- data_raw %>%
  filter(!is.na(Start_Curr_Job), !is.na(End_Curr_Job),
         Start_Curr_Job != "NA", End_Curr_Job != "NA" ) %>%
  mutate(Start_Curr_Job = as.numeric(Start_Curr_Job),
         End_Curr_Job = as.numeric(End_Curr_Job)) %>%
mutate(all_years = seq(from = Start_Curr_Job, to = End_Curr_Job, by = 1))

错误消息:“seq.default 中的错误(从 = Start_Curr_Job,到 = End_Curr_Job,by = 1): 'from' 的长度必须为 1"

我也尝试了以下,但它产生了 allyears = "2019:2012",这也不是我想要的。

  for (row in 1:nrow(data_clean)) {
    data_clean$years[row] <- list(data_clean$Start_Curr_Job[row]:data_clean$End_Curr_Job[row])
  }

【问题讨论】:

  • 您好,欢迎来到 stackoverflow。使用seq 函数应该创建一个包含起点和终点的数字向量(见下文)。为了提供更多帮助,也许您可​​以提供reproducible example and data? seq(from = 2009, to = 2012)
  • 但是我下面的代码不起作用...你应该告诉我们为什么它不起作用。阅读此线程stackoverflow.com/questions/5963269/… 以了解您应该共享哪些信息(一个最小的工作示例(意思是数据集)、您的代码(您共享的)以及如果您寻求调试时的错误)。此外,请访问how to ask 并拨打tour
  • @Dean OP 已经在使用 seq(from = Start_Curr_Job, to = End_Curr_Job, by = 1) 请仔细阅读问题。干杯。
  • 感谢您的帮助。我收到以下错误消息: seq.default 中的错误(从 = Start_Curr_Job,到 = End_Curr_Job,by = 1):'from' must be of length 1
  • @Dean 刚刚添加了可重现的数据。谢谢!

标签: r dplyr


【解决方案1】:

这里的问题是 seq 没有向量化,因此它不能接受向量作为其参数。还有一篇文章概述了如何向量化函数here

否则,另一种方法是使用 purrr 包中的 map2_ 函数。下面的代表

library(tidyverse)
library(purrr)

Start_Curr_Job <- c(2009, 2011, 2014)
End_Curr_Job <- c(2012, 2015, 2019)
data_raw <- data.frame(Start_Curr_Job, End_Curr_Job)

data_clean <- data_raw %>%
  filter(!is.na(Start_Curr_Job), !is.na(End_Curr_Job),
         Start_Curr_Job != "NA", End_Curr_Job != "NA" ) %>%
  mutate(Start_Curr_Job = as.numeric(Start_Curr_Job),
         End_Curr_Job = as.numeric(End_Curr_Job)) %>% 
  mutate(all_years =  purrr::map2_chr(.x = Start_Curr_Job, .y = End_Curr_Job, .f = ~paste(seq(.x, .y), collapse = ", ")))

data_clean
#>   Start_Curr_Job End_Curr_Job                          all_years
#> 1           2009         2012             2009, 2010, 2011, 2012
#> 2           2011         2015       2011, 2012, 2013, 2014, 2015
#> 3           2014         2019 2014, 2015, 2016, 2017, 2018, 2019

reprex package (v0.2.1) 于 2019 年 5 月 29 日创建

【讨论】:

    【解决方案2】:

    您可以将apply()paste()seq() 从基础R 结合使用-

    data_clean$years <- apply(data_clean, 1, function(x) paste(seq(x[1], x[2]), collapse = ", "))
    
      Start_Curr_Job End_Curr_Job                              years
    1           2009         2012             2009, 2010, 2011, 2012
    2           2011         2015       2011, 2012, 2013, 2014, 2015
    3           2014         2019 2014, 2015, 2016, 2017, 2018, 2019
    

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2018-05-20
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多