我有一个包含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
}
答案 0 :(得分:1)
你几乎就在那里,但你不需要在select
参数中引用数据帧 - 这应该有效:
rst <- subset(result, states == 'Alabama', select = c(levels, weeks))
您还可以查看包dplyr
,它为您提供类似SQL的功能,非常适合处理更大,更复杂的数据集。
修改强>
感谢你发布你的代码 - 我想我已经发现了一些问题。
您从extract_data()
返回的结果是list
,而不是data.frame
- 这就是forecast()
中的代码不起作用的原因。如果确实返回了数据帧,则原始解决方案可以正常工作。
您正在使用向量和列表的组合形成列表,这是一个问题 - dataframe
(大致)是vectors
的列表,而不是result <- data.frame(...)
的集合两种类型。如果您将列表创建行替换为lvs
,则会因此而遇到问题。
有两个有问题的列 - levels
(或wks
)和weeks
(lapply()
)。使用sapply()
的地方,使用wk_list
会根据需要为您提供一个向量(请参阅the manual)。第二个问题是周列。你在这里实际处理的是一个长度为3的字符向量列表。没有简单的方法可以做你想做的事情 - 例如,你不能让数据框中每列的“单元格”包含一个字符矢量,因为列本身就是矢量。
我的建议是:
wk_list
构建您的data.frame,而不是将每个日期拆分为三个字符串; 或者最后,将周列拆分为三列,这样您就有一个月,一个是一天,一个是一年。您可以从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
一旦wks
和result<-data.frame("states"=st_list,"levels"=lvs,"lvlnames"=lvn_list,"weeks"=wks)
都是矢量形式,你就可以运行了
foreach
并且脚本应该可以工作。