根据R

时间:2015-09-26 18:01:31

标签: r dataframe subset

我有一个包含4列的数据框。在其中一列上我添加了一个日期,以便每个值看起来像这样

>print(result[[4]][[10000]])
[[10000]]
[1] "Jan"  "14"   "2012"

这意味着在第4列的第1000个字段中,我有这3个字段。这是唯一的多列。

现在数据帧结果的其他3列是单个值而不是多个。其中一个专栏,第一个专栏,将美国各州列为价值观。我想要做的是从结果数据框的第2列和第4列(上面描述的那个)创建一个新的数据框,但取决于状态。

因此,例如,我想要所有阿拉巴马州的第二列和第四列数据。我尝试了这个,但我认为它没有正常工作。 “levels”是第2列,“weeks”是数据框结果的第4列。

rst <- subset(result, result$states == 'Alabama', select = c(result$levels, result$weeks))

这里的问题是子集将所有列复制到rst,而不仅仅是链接到Alabama状态的结果数据帧的第二个和第四个列,这是我想要的唯一。知道如何正确地做到这一点吗?

编辑以添加代码

我在这里添加代码,因为我认为必须有一些我在这里看不到的东西。首先是csv文件中原始数据的一小部分样本

st      URL                         WEBSITE                 al      aln     wk          WEEKSEASON
Alabama http://adph.org/influenza/  Influenza Surveillance  Level 1 Minimal Oct-04-2008 40  2008-09
Alabama http://adph.org/influenza/  Influenza Surveillance  Level 1 Minimal Oct-11-2008 41  2008-09
Alaska  http://adph.org/influenza/  Influenza Surveillance  Level 1 Minimal Oct-18-2008 42  2008-09
Alaska  http://adph.org/influenza/  Influenza Surveillance  Level 1 Minimal Oct-25-2008 43  2008-09

这是代码

#Extracts relevant data from the csv file
extract_data<-function(){

  #open the file. NAME SHOULD BE CHANGED
  sd <- read.csv(file="sdr.csv",head=TRUE,sep=",")

  #Extracts the data from the ACTIVITY LEVEL column. Notice that the name of the column was changed on the file
  #to 'al' to make the reference easier
  lv_list <- sd$al
  #Gets only the number from each value getting rid of the word "Level"
  lvs <- lapply(strsplit(as.character(lv_list), " "), function(x) x[2])

  #Gets the ACTIVITY LEVEL NAME. Column name was changed to 'aln' on the file
  lvn_list <- sd$aln

  #Gets the state. Column name was changed to 'st' on the file
  st_list <- sd$st

  #Gets the week. Column name was changed to 'wk' on the file
  wk_list <- sd$wk
  #Divides the weeks data in month, day, year
  wks <- strsplit(as.character(wk_list), "-")

  result<-list("states"=st_list,"levels"=lvs,"lvlnames"=lvn_list,"weeks"=wks)

  return(result)

}

forecast<-function(){

  result=extract_data()

  rst <- subset(result, states == 'Alabama', select = c(levels, weeks))

  return(0) #return results
}

1 个答案:

答案 0 :(得分:1)

你几乎就在那里,但你不需要在select参数中引用数据帧 - 这应该有效:

rst <- subset(result, states == 'Alabama', select = c(levels, weeks))

您还可以查看包dplyr,它为您提供类似SQL的功能,非常适合处理更大,更复杂的数据集。

修改

感谢你发布你的代码 - 我想我已经发现了一些问题。

  1. 您从extract_data()返回的结果是list,而不是data.frame - 这就是forecast()中的代码不起作用的原因。如果确实返回了数据帧,则原始解决方案可以正常工作。

  2. 您正在使用向量和列表的组合形成列表,这是一个问题 - dataframe(大致)是vectors的列表,而不是result <- data.frame(...)的集合两种类型。如果您将列表创建行替换为lvs,则会因此而遇到问题。

  3. 有两个有问题的列 - levels(或wks)和weekslapply())。使用sapply()的地方,使用wk_list会根据需要为您提供一个向量(请参阅the manual)。第二个问题是周列。你在这里实际处理的是一个长度为3的字符向量列表。没有简单的方法可以做你想做的事情 - 例如,你不能让数据框中每列的“单元格”包含一个字符矢量,因为列本身就是矢量。

    我的建议是:

    • 使用原始格式“Oct-01-2008”,即使用wk_list构建您的data.frame,而不是将每个日期拆分为三个字符串;
    • 使用像lubridate这样的包将原始格式转换为更好的时间格式(A +++++会推荐,包装很棒);
    • 或者最后,将周列拆分为三列,这样您就有一个月,一个是一天,一个是一年。您可以从wks <- sapply(strsplit(as.character(wk_list), "-"), function(x) c(x[1], x[2], x[3])) Month <- wks[1,] Day <- wks[2,] Year <- wks[3,] 这样简单地完成此操作:

      lvs

    一旦wksresult<-data.frame("states"=st_list,"levels"=lvs,"lvlnames"=lvn_list,"weeks"=wks) 都是矢量形式,你就可以运行了

    foreach

    并且脚本应该可以工作。