簡體   English   中英

根據新數據框過濾數據框

[英]filter data frame based on new data frame

這是一些玩具數據

x <- c("Bird","Bird","Tiger","Bird","Fish","grey","blue","orange","green","yellow","10","5","7","12","5","10","10","8","12","2","10","20","10","18","3")
m <- matrix(x,byrow = F,ncol = 5,nrow= 5)
m <- as.data.frame(m)
colnames(m) <- c("Animal","colour","length","height","weight")

y <- c("Tiger","Bird","Bird","colour","length","colour","orange","10","green","orange/black","12","light green")
new.m <- matrix(y,byrow=F,ncol=4,nrow = 3)
new.m <- as.data.frame(new.m)
colnames(new.m) <- c("Animal","attribute","value","new value")

如何使用數據框new.m有效地更新m的值。 最終結果應如下所示:

z <- c("Bird","Bird","Tiger","Bird","Fish","grey","blue","orange/black"," light green","yellow","12","5","7","12","5","10","10","8","12","2","10","20","10","18","3")
update.m <- matrix(z,byrow = F,ncol = 5,nrow= 5)
update.m <- as.data.frame(update.m)
colnames(update.m) <- c("Animal","colour","length","height","weight")

對於new.m中的固定行,我可以輕松實現。 但這可以通過綜合而不是基於行的方式來完成嗎?

一個通過基數R的想法。我們首先創建一個矩陣,其中包含我們需要更新值的列。 我們使用match更新值。 nomath項的結果為NA ,我們replacereplace為原始值並將其放回原始數據幀中。

m3 <- sapply(m[c(2:3)], function(i) new.m$`new value`[match(i, new.m$value)])
m[c(2:3)] <- replace(m3, is.na(m3), m[c(2,3)][which(is.na(m3), arr.ind = TRUE)])

m
#  Animal       colour length height weight
#1   Bird         grey     12     10     10
#2   Bird         blue      5     10     20
#3  Tiger orange/black      7      8     10
#4   Bird  light green     12     12     18
#5   Fish       yellow      5      2      3

暫無
暫無

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

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