根据行不匹配的另一个DF中的值更改一个DF中的值

时间:2016-05-21 23:54:06

标签: r functional-programming

下面,我尽可能地描述我想要做的事情,然后包括我最好的尝试MWE(包括2个csv文件)。

问题:我有两个DF。一,将其称为mweLookUpspLUvMax,并说10行。另外,将其称为mweData,其列pvvPrime,代表100行。

我想更改mweData每一行的值,以便v的值高于vMaxmweLookUps的值pLU与给定行的pmweData的值相同,它将替换为vMax.的值

解决方案MWE

mweData <- data.frame(p = c(rep(c(34:36), 5), rep(50:53, 5)), v = runif(35, 1000, 20000))
mweData$vPrime <- mweData$v
mweLookUps <- data.frame(p = c(34:36, 50:53), vMax = runif(7, 1600, 12000))
foo <- merge(mweData, mweLookUps, by = 'p')
foo$vPrime <- ifelse(foo$v > foo$vMax, foo$vMax, foo$v)

我的尝试

mweData <- data.frame(p = c(rep(c(34:36), 5), rep(50:53, 5)), v = runif(35, 1000, 20000))
mweData$vPrime <- mweData$v
mweLookUps <- data.frame(p = c(34:36, 50:53), vMax = runif(7, 1600, 12000))
logic <- mweLookUps$p == mweData$p
tmp <- mweLookUps[logic, "vMax"]
mweData[mweData$vPrime > tmp, "vPrime"] <- tmp
  

[<-.data.frame*tmp*,mweData $ vPrime&gt; tmp,“vPrime”,值= c(3323.34631364793,:     数据帧的下标分配中不允许缺少值

2 个答案:

答案 0 :(得分:3)

我不确定我理解你需要什么,但如果我这样做,我就是这样做的。

# merge on column p
foo <- merge(mweData, mweLookUps, by = "p") 
#for each row, if v > vMax, put vMax into vPrime, else put v into vPrime
foo$vPrime <- ifelse(foo$v > foo$vMax, foo$vMax, foo$v) 

答案 1 :(得分:3)

这可以在pmin之后使用merge完成。使用dplyr加入

library(dplyr)
left_join(mweData, mweLookUps, by = "p") %>% 
                       mutate(v = pmin(vMax, v))