【问题标题】:using lapply in R在 R 中使用 lapply
【发布时间】:2014-02-11 13:24:32
【问题描述】:

我有一个包含 10 个变量的数据框,这显然存在一些数据问题。例如,说 column1 不应该大于 column2,但是在数据中我们有一些违反这一点的条目。所以,我们假设如果column1>column2,将column1中的值替换为column2中对应的值。 现在我想将 col1,col3,col4 与 col2 进行比较,并将与上述相同的逻辑应用于所有列。 我在 R 中使用了ifelse 函数,比如

data$col1 <- ifelse (data$col1>data$col2,data$col2,data$col1)

这很好用。

但是有没有一种方法可以让所有 cols(即 col1、col3 和 col4)都达到相同的效果 立刻? 我认为可以使用lapply 完成,但不太确定如何。

【问题讨论】:

  • 您到底想检查什么? col1&gt;col2, col1&gt;col3, col1&gt;col4 还是 col1&gt;col2&gt;col3&gt;col4?
  • @nico 我想要以下检查: 1. if col1>col2 set value of col1=corresponding value of col 2 else no change 2. if col3>col2 set value of col3=corresponding value of col 2 else 不变 3. if col4>col2 set value of col4=corresponding value of col 2 else no change

标签: r if-statement lapply


【解决方案1】:

此版本将除2 之外的任何列中的所有值设置为小于或等于2 列中的值。首先,制作玩具数据:

df <- as.data.frame(replicate(10, sample(1:10), simplify=F))
names(df) <- paste0("col", 1:10)

现在,使用lapply 来实现您的目标,将除2 之外的所有列替换为上限值:

df[-2] <- lapply(df[-2], function(x) ifelse(x > df[[2]], df[[2]], x))
df

目前尚不清楚您要做什么,但是如果您能澄清一下,我可以提供更有针对性的答案。不管怎样,希望这能给你一些想法。

【讨论】:

  • 这就是我想要的: 1. if col1>col2 set value of col1=corresponding value of col 2 else no change 2. if col3>col2 set value of col3=corresponding value of col 2 else没有变化 3. if col4>col2 set value of col4=corresponding value of col 2 else no change
【解决方案2】:

您可以使用for

set.seed(31415)
(data <- data.frame(matrix(rnorm(100), ncol=10)))

for (i in c(1, 3, 4, 7)) { # Let's check columns 1, 3, 4 and 7
data[, i] <- ifelse(data[, i] > data[, 2], data[, 2], data[, i])
}
data

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 2015-11-23
    • 1970-01-01
    • 2018-12-15
    • 2017-09-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多