下面,我尽可能地描述我想要做的事情,然后包括我最好的尝试MWE(包括2个csv文件)。
问题:我有两个DF。一,将其称为mweLookUps
列pLU
,vMax
,并说10行。另外,将其称为mweData
,其列p
,v
和vPrime,
代表100行。
我想更改mweData
每一行的值,以便v
的值高于vMax
中mweLookUps
的值pLU
与给定行的p
中mweData
的值相同,它将替换为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,: 数据帧的下标分配中不允许缺少值
答案 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))