首页 > 解决方案 > R制作数据框列表

问题描述

我有一个相当大的数据框,我正在使用 slice() 将其切成我需要的部分。我尝试编写一个我认为可以完成我想做的事情的函数。这就是我最初做事的方式:

Alabama <- slice(Crime_US, 1:31)

Alaska <- slice(Crime_US, 40:70)

Arizona <- slice(Crime_US, 79:109)

Arkansas <- slice(Crime_US, 118:148)

California <- slice(Crime_US, 156:186)

这是阿拉巴马州的一些输出:

Year  Population `Violent crime to… `Murder and nonneglige… `Legacy rape /1` `Revised rape /… Robbery `Aggravated assa…
  <chr> <chr>      <chr>              <chr>                   <chr>            <chr>            <chr>   <chr>            
1 1970  3444165    10185              404                     637              NA               1731    7413             
2 1971  3479000    10835              524                     661              NA               2005    7645             
3 1972  3510000    10994              496                     660              NA               2407    7431             
4 1973  3539000    12390              468                     751              NA               2809    8362             
5 1974  3577000    13338              536                     811              NA               3562    8429             
6 1975  3614000    14201              577                     738              NA               4446    8440

这就是我想做的。这是一些需要澄清的代码。

Crime_US <- read_excel("crimeAllStates.xlsx", skip=9)

states_vec <- c("Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "D.C.", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennslyvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming")


counter <- 1
m <- 1
n <- 31
makeMyStates <- function(df) {
  states_vec[counter] <- slice(df, m:n)
  counter <- (counter + 1)
  m <- (m + 39)
  n <- (n + 39)
}

sapply(Crime_US, makeMyStates)

不幸的是,我收到了这个错误:

Error in UseMethod("slice_") : no applicable method for 'slice_' applied to an object of class "character"

我尝试用谷歌搜索错误无济于事,而且我对 R 没有太多经验。

标签: rfunctionslice

解决方案


m如果您必须根据and中的值诉诸任意中断n,我认为尝试填充列表可能会有所帮助。

您的行:states_vec[counter] <- slice(df, m:n)正在尝试使用数据框填充字符向量,这就是您收到此错误的原因。

带有列表的 for 循环可能是解决此问题的一种方法(尽管它不是很整洁):

    state_crime <- list() 
    m <- 1
    n <- 31

    for (i in 1:length(states_vec)){

      state_crime[[i]] <- slice(Crime_US, m:n) %>%
                          mutate(state = states_vec[i])

      m <- (m + 39)
      n <- (n + 39) 

      }

然后使用states_vec列表命名列表中的每个元素,或者只是绑定行以创建一个新的数据框。

names(state_crime) <- states_vec

bind_rows(state_crime)


推荐阅读