簡體   English   中英

根據 R 中第三列的值復制數據框的列

[英]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 的能力,非常適合處理更大更復雜的數據集。

編輯

感謝您發布您的代碼 - 我想我已經確定了一些問題。

  1. 您從extract_data()返回的結果是一個list ,而不是一個data.frame - 這就是forecast()中的代碼不起作用的原因。 如果它確實返回了一個數據幀,則原始解決方案將起作用。

  2. 您正在從向量和列表的組合中形成列表,這是一個問題 - dataframe (大致)是一個vectors列表,而不是這兩種類型的集合。 如果你用result <- data.frame(...)替換你的列表創建行,你會因此遇到問題。

有兩個有問題的列 - lvs (或levels )和wksweeks )。 在您使用lapply() ,使用sapply()會根據需要為您提供一個向量(請參閱手冊)。 第二個問題是周列。 您在這里實際處理的是長度為 3 的字符向量列表。 沒有簡單的方法可以做您想做的事 - 例如,您不能讓數據幀中列的每個“單元格”都包含一個字符向量,因為列本身就是向量。

我的建議是:

  • 使用原始格式“Oct-01-2008”,即使用wk_list構建您的wk_list而不是將每個日期拆分為三個字符串;
  • 使用lubridate之類的包將原始格式轉換為更好的時間格式(推薦A+++++,很棒的包);
  • 或者最后,將周列分成三列,這樣您就可以有一列代表月,一列代表天,一列代表年。 您可以像這樣從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,]

一旦lvswks都是向量形式,你就可以運行了

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

並且腳本應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM