![](/img/trans.png)
[英]How to compare two columns in R data frame and return 0 or 1 in the third column based on the comparison?
[英]Copy columns of a data frame based on the value of a third column in R
我有一個包含 4 列的數據框。 在其中一列上我添加了一個日期,以便每個值看起來像這樣
>print(result[[4]][[10000]])
[[10000]]
[1] "Jan" "14" "2012"
這意味着在第 4 列的第 1000 個字段上,我有這 3 個字段。 這是唯一的多列。
現在數據框結果的其他 3 列是單個值而不是多個值。 其中一列,即第一列,將美國各州作為值。 我想要做的是從結果數據框的第 2 列和第 4 列(上述那個)創建一個新的數據框,但取決於狀態。
例如,我想要阿拉巴馬州的所有第 2 列和第 4 列數據。 我試過這個,但我認為它不能正常工作。 “levels”是數據框結果的第 2 列,“weeks”是第 4 列。
rst <- subset(result, result$states == 'Alabama', select = c(result$levels, result$weeks))
這里的問題是子集將所有列復制到第一個,而不僅僅是鏈接到阿拉巴馬州的結果數據框的第二個和第四個,這是我唯一想要的。 知道如何正確執行此操作嗎?
編輯以添加代碼
我在這里添加代碼是因為我認為這里一定有我沒有看到的東西。 首先是 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
}
你快到了,但你不需要在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()
會根據需要為您提供一個向量(請參閱手冊)。 第二個問題是周列。 您在這里實際處理的是長度為 3 的字符向量列表。 沒有簡單的方法可以做您想做的事 - 例如,您不能讓數據幀中列的每個“單元格”都包含一個字符向量,因為列本身就是向量。
我的建議是:
wk_list
構建您的wk_list
而不是將每個日期拆分為三個字符串; 或者最后,將周列分成三列,這樣您就可以有一列代表月,一列代表天,一列代表年。 您可以像這樣從wk_list
非常簡單地做到這一點:
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)
並且腳本應該可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.