【问题标题】:Ifelse applied to an interval of columns, but keeping all the other columnsIfelse 应用于列的间隔,但保留所有其他列
【发布时间】:2021-11-30 10:47:15
【问题描述】:

我想使用ifelse 函数将新的values 赋予df 中的一组columns。真正的df有>200个columns,所以我不能说出columns的名字,而是需要指定columns的区间(例如2:205)。

df <- data.frame(x=c(123, 121, 120, 124, 125), y=c(1, 0, 0, 0, 1), z=c(0,0, 0, 0, 1))
df
    x y z
1 123 1 0
2 121 0 0
3 120 0 0
4 124 0 0
5 125 1 1

但是,当我指定列的间隔时,会跳过第一个 column。如何保持第一个 column 不变?

df2 <- as.data.frame(ifelse(df[2:3] == 1, 2, 0))
df2
  y z
1 2 0
2 0 0
3 0 0
4 0 0
5 2 2

谢谢。

【问题讨论】:

  • 为什么不简单地 cbind() 在您运行 ifelse() 之后像这样:df3 &lt;- cbind(x=df[,1], df2) 您的列?

标签: r if-statement multiple-columns


【解决方案1】:

最简单的解决方案是使用您当前的代码,但使用df[2:3]&lt;-function(df[2:3]) 将您的输出重新分配给原始数据的同一子集:

df2<-df
df2[2:3]<- as.data.frame(ifelse(df[2:3] == 1, 2, 0))
df2
    x y z
1 123 2 0
2 121 0 0
3 120 0 0
4 124 0 0
5 125 2 2

或者我们可以使用 dplyr:

library(dplyr)

df %>% mutate(across(2:3, ~ifelse(.x==1, 2, 0)))

    x y z
1 123 2 0
2 121 0 0
3 120 0 0
4 124 0 0
5 125 2 2

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2021-10-26
    • 2021-04-16
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多