R 基于具有不匹配行的另一个DF中的值更改一个DF中的值
下面,我将尽我所能描述我正在尝试做的事情,然后包括我的最佳尝试MWE(包括2个csv文件) 问题:我有两个DFs。第一,称之为R 基于具有不匹配行的另一个DF中的值更改一个DF中的值,r,functional-programming,R,Functional Programming,下面,我将尽我所能描述我正在尝试做的事情,然后包括我的最佳尝试MWE(包括2个csv文件) 问题:我有两个DFs。第一,称之为mweLookUps有列pLU,vMax,比如说10行。另一种,称之为mweData有p、v和vPrime,等列,比如说有100行 我想更改mweData的每一行中的值,这样,如果v的值高于mweLookUps中的vMax,其中pLU与mweData中给定行的p的值相同,则替换为vMax的值。 解决方案MWE mweData <- data.frame(p = c(
mweLookUps
有列pLU
,vMax
,比如说10行。另一种,称之为mweData
有p
、v
和vPrime,
等列,比如说有100行
我想更改mweData
的每一行中的值,这样,如果v
的值高于mweLookUps
中的vMax
,其中pLU
与mweData
中给定行的p
的值相同,则替换为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我不确定我是否正确理解您的需求,但如果我理解,我会这样做
# 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)
#在p列上合并
foo vMax,将vMax放入vPrime,否则将v放入vPrime
foo$vPrime foo$vMax,foo$vMax,foo$v)
我不确定我是否正确理解您的需求,但如果我理解,我会这样做
# 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)
#在p列上合并
foo vMax,将vMax放入vPrime,否则将v放入vPrime
foo$vPrime foo$vMax,foo$vMax,foo$v)
这也可以在合并后使用pmin
完成。使用dplyr
join
library(dplyr)
left_join(mweData, mweLookUps, by = "p") %>%
mutate(v = pmin(vMax, v))
这也可以在merge
ing之后使用pmin
完成。使用dplyr
join
library(dplyr)
left_join(mweData, mweLookUps, by = "p") %>%
mutate(v = pmin(vMax, v))
谢谢你的反馈。我试图通过使用生成csv文件的命令替换csv文件来进一步提高运行的易用性。我还尝试更新代码中的命名约定,以匹配我在描述中的命名约定。感谢您的反馈。我试图通过使用生成csv文件的命令替换csv文件来进一步提高运行的易用性。我还尝试更新代码中的命名约定,使之与我在描述中的命名约定相匹配。这几乎就是它,非常感谢:D我将清理这两个问题,并将其添加到我的问题中。主要的想法是,对于merge,它必须是by=“p”,而不是by=p。。。另一件事是,我希望ifelse的结果是foo$vPrime而不是foo$vindect,很抱歉输入错误。编辑了你需要的答案。这几乎就是它,非常感谢:D我将清理这两个问题,并将其添加到我的问题中。主要的想法是,对于merge,它必须是by=“p”,而不是by=p。。。另一件事是,我希望ifelse的结果是foo$vPrime而不是foo$vindect,很抱歉输入错误。编辑了您需要的答案。