簡體   English   中英

如何將數據幀“ a”的子集分配給數據幀“ b”的子集

[英]How to assign a subset from a data frame `a' to a subset of data frame `b'

這可能是一個瑣碎的問題(我是R的新手),但是無論是在SO還是其他地方,我都找不到答案。 我的情況如下。

我有一個數據框df ,我想更新一個子集df$tag值。 df與以下類似:

id = rep( c(1:4), 3)
tag = rep( c("aaa", "bbb", "rrr", "fff"), 3)
df = data.frame(id, tag)

然后,我嘗試使用match()從數據幀的子集更新列tag ,方法是使用包含兩個列(即keyvalue )的第二個數據幀(例如aux)。 子集由id = n定義,根據n in unique(df$id) aux如下所示:

 > aux 
     key      value
   "aaa"  "valueAA"
   "bbb"  "valueBB"
   "rrr"  "valueRR"
   "fff"  "valueFF"

我試圖遍歷數據框,如下所示:

for(i in unique(df$id)){
   indexer = df$id == i

   # here is how I tried to update the dame frame:
   df[indexer,]$tag <- aux[match(df[indexer,]$tag, aux$key),]$value
}

預期的結果是df[indexer,]$tagaux$value的相應值更新了。 實際結果是df$tag與NA相符。 我沒有任何錯誤,但是出現了以下警告消息:

在'[<-。factor'(' tmp ',df $ id == i,value = c(NA,:無效因子水平,NA生成

之前,我使用的是df$tag <- aux[match(df$tag, aux$key),]$value ,它可以正常工作,但是某些重復的df$tags使match()產生了許多錯誤的更新行。 我還模擬了子設置,它工作正常。 有人可以為此更新提出解決方案嗎?

UPDATE(最終數據集的外觀如何?):

 > df
      id       tag
       1  "valueAA"
       2  "valueBB"
       3  "valueRR"
       4  "valueFF"
    (...)     (...)

先感謝您。

這會產生您期望的輸出嗎?

df$tag <- aux$value[match(df$tag, aux$key)]

除非您在aux有重復項, merge()也會工作。

事實證明,我的數據破壞了所有可用的內置函數,最終為我提供了錯誤的數據集。 然后,我的解決方案(至少是初步解決方案)如下:

  1. 分別處理每個子集;
  2. 將每個數據框添加到列表中;
  3. 使用rbindlist(a.list, use.names = T)獲得帶有結果的完整數據框。

暫無
暫無

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

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