簡體   English   中英

在 R 中,如何檢查一個 dataframe 中的列名是否存在於另一個 dataframe 中,然后在該列中插入一個值?

[英]In R, how do I check to see if a column name in one dataframe is present in another dataframe and then insert a value into that column?

我有三個具有不同列數和名稱的單行數據框...

df1: 
   0 3 6  7 10 14 17
2 18 9 1 14  2  1  1

df2:
   0 3 7 9 10 13 14 17 21 35
2 10 4 8 1  5  2 11  2  1  1

df3:
   0 3 7  10 12
2  7 3 11  3  1

...我有一個主 dataframe。

CREATION CODE
masterdf <- data.frame(matrix(ncol = 50, nrow = 0))
colnames(masterdf) <- c('0',2:50)

   0  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 
1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
  33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 
1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 

我想獲取每個較小的數據幀,並將每行一個放入主 dataframe 中,並使用匹配列中的值。 完成后,更新后的主控 dataframe 將如下所示:

   0  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 
1 18 NA  9 NA NA  1 14 NA NA  2 NA NA NA  1 NA NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2 10 NA  4 NA NA NA  8 NA  1  5 NA NA  2 11 NA NA  2 NA NA NA  1 NA NA NA NA NA NA NA NA NA NA NA 
3  7 NA  3 NA NA NA 11 NA NA  3 NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 

  33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 
1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2 NA NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 

是的,列名確實需要保留為數字。 如您所見,列數隨每個編號的數據幀而變化。

其他注意事項:

第一列名稱0,第二列名稱2。

0 列在每個 dataframe 中總是有一個值。

每個編號的 dataframe 中的行號 (2) 對我來說是多余的。

我試過嵌套循環但沒有成功。

我的用例最終會在主 dataframe 中出現數千行。

想法?

我認為您可以嘗試match function。 它是一個基礎 R function。 請參閱下面的快速示例:

?match
match("2", c("1","2","3"))

兩次嘗試:

  1. 基本for循環,對於很多行可能會有點慢:
df_list <- list(df1,df2,df3)
for(i in seq_along(df_list)) {
    masterdf[i, names(df_list[[i]])] <- df_list[[i]]
}
  1. 使用矩陣索引和對所有匹配行和列的單個分配的矢量化方法
df_list <- list(df1,df2,df3)
masterdf[seq_along(df_list),] <- NA
masterdf[cbind(
    rep(seq_along(df_list), lengths(df_list)),
    match(unlist(lapply(df_list, names)), names(masterdf))
)] <- unlist(df_list)

您可以簡單地使用 data.table 中的rbindlist data.tablefill = T

data.table::rbindlist(list(masterdf, df1, df2, df3), fill = T)

結果

    0  2 3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
1: 18 NA 9 NA NA  1 14 NA NA  2 NA NA NA  1 NA NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2: 10 NA 4 NA NA NA  8 NA  1  5 NA NA  2 11 NA NA  2 NA NA NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
3:  7 NA 3 NA NA NA 11 NA NA  3 NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

數據

masterdf <- data.frame(matrix(ncol = 50, nrow = 0))
colnames(masterdf) <- c('0',2:50)

df1 <- data.frame(t(data.frame("2" = c(18,9,1,14,2,1,1))))
colnames(df1) <- c(0,3,6,7,10,14,17)

df2 <- data.frame(t(data.frame("2" = c(10,4,8,1,5,2,11,2,1,1))))
colnames(df2) <-  c(0,3,7,9,10,13,14,17,21,35)

df3 <- data.frame(t(data.frame("2" = c(7,3,11,3,1))))
colnames(df3) <- c(0,3,7,10,12)

暫無
暫無

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

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