![](/img/trans.png)
[英]Check to see if value from one column is present in two other columns in one dataframe R
[英]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"))
兩次嘗試:
for
循環,對於很多行可能會有點慢:df_list <- list(df1,df2,df3)
for(i in seq_along(df_list)) {
masterdf[i, names(df_list[[i]])] <- df_list[[i]]
}
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.table
並fill = 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.