【问题标题】:Changing value in one DF based on value in another DF with mismatched rows根据行不匹配的另一个 DF 中的值更改一个 DF 中的值
【发布时间】:2016-09-19 01:07:21
【问题描述】:

下面,我将尽我所能描述我正在尝试做的事情,然后包括我的最佳尝试 MWE(包括 2 个 csv 文件)。

问题:我有两个 DF。一,称它为mweLookUps 有列pLUvMax 并说10 行。另一个,称它为mweData 有列pvvPrime,,比如100 行。

我想更改mweData 每一行中的值,这样如果v 的值高于mweLookUps 中的vMax,其中pLUp 中的值相同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

[&lt;-.data.frame(*tmp*, mweData$vPrime > tmp, "vPrime", value = c(3323.34631364793, : 数据框的下标赋值中不允许有缺失值

【问题讨论】:

  • 感谢您的反馈。我试图通过用我用来生成它们的命令替换 csv 文件来进一步提高运行该东西的便利性。我还尝试更新代码中的命名约定以匹配我在描述中的内容。

标签: r functional-programming


【解决方案1】:

我不确定我是否理解您的需求,但如果我理解了,我会这样做。

# 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) 

【讨论】:

  • 这几乎就是它,非常感谢 :D 我将清理几个问题并将其添加到我的问题中。主要的想法是,对于合并,它必须是 by = "p" 而不是 by = p ...另一件事是我希望 ifelse 的结果在 foo$vPrime 而不是 foo$v 中跨度>
  • 确实,抱歉打错了。编辑了您需要的答案。
【解决方案2】:

这也可以在mergeing 之后使用pmin 完成。使用dplyr 加入,

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

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2020-12-29
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2012-10-12
    • 2020-04-06
    相关资源
    最近更新 更多