【问题标题】:R Replace values in multiply columns based on specified condition?R根据指定条件替换乘列中的值?
【发布时间】:2017-09-17 00:32:30
【问题描述】:

如何将第一行中“N”的第 2 到第 7 个值替换为“Y”?第一个值保持“N”

     SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090
1       N       N       N       N       N       N       N
2       N       N       N       N       N       N       Y
3       N       N       N       N       N       Y       N

我的愿望结果是:

1       N       Y       Y       Y       Y       Y       Y

非常感谢,

一个。

【问题讨论】:

    标签: r replace multiple-columns


    【解决方案1】:
    a <- read.table("a.txt", sep = '\t', header=TRUE, stringsAsFactors=FALSE)
    a
         SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090
    1       N       N       N       N       N       N       N
    2       N       N       N       N       N       N       Y
    3       N       N       N       N       N       Y       N
    a[1,2:7] <- "Y"
    a
         SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090
    1       N       Y       Y       Y       Y       Y       Y
    2       N       N       N       N       N       N       Y
    3       N       N       N       N       N       Y       N
    

    好的,这有点棘手,但可以做到。我将编辑这个答案。我们只想在从 2:7 列中只有 N 的行中将 N 更改为 Y,所以我添加了值为 FALSE 和 TRUE 的新列。如果行只有 N 从列 2:7 值为 FALSE 因为我们没有任何 Y。我使用

    b$new <- apply(b[,2:7], 1, function(x) any(x %in% c("Y")))
    
         SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090   new
    1       N       N       N       N       N       N       N     FALSE
    2       N       N       N       N       N       N       Y     TRUE
    3       N       N       N       N       N       Y       N     TRUE
    

    如果我们在new 列中有 FALSE,我们可以将值 Y 放在 2:7 列中

    b[,2:7][b$new==FALSE ,] <- "Y"
    

    所以我们得到了想要的结果。

         SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090   new
    1       N       Y       Y       Y       Y       Y       Y     FALSE
    2       N       N       N       N       N       N       Y     TRUE
    3       N       N       N       N       N       Y       N     TRUE
    

    总而言之,roww 中第 2:7 列中值为 N 的每个值都将替换为 Y。 当然我们不需要列new,所以我们可以删除它

    b$new <- NULL
    

    好的,所以在列和条形图中计算出现次数:

    x <- apply(a, 2, table)
    y <- do.call(rbind, x)
    

    Easy R bulit 条形图

    z <- as.data.frame(t(y))
    barplot(data.matrix(z[1:2,]), col=c("darkblue","red"),beside=TRUE)
    

    如果您自己绘制,X 轴标签会扩大。

    还有其他方法可以使用 ggplot 包获取此图,但我必须重新构建数据文件,这有点耗时,干杯!

    >dat
      SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090
    1       N       Y       Y       Y       Y       Y       Y
    2       N       N       N       N       N       N       Y
    3       N       N       N       N       N       N       N
    4       N       N       N       N       N       Y       N
    5       N       Y       N       Y       N       N       N
    6       Y       Y       Y       Y       Y       Y       Y
    dat$new <- apply(dat[,1:7], 1, function(x) all(x %in% c("Y") | all((x %in% c("N")))))
    result <- dat[dat$new!=TRUE, ]
    result$new <- NULL
    > result
      SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090
    1       N       Y       Y       Y       Y       Y       Y
    2       N       N       N       N       N       N       Y
    4       N       N       N       N       N       Y       N
    5       N       Y       N       Y       N       N       N
    

    【讨论】:

    • 谢谢!我有数百万行具有“Y”和“N”的不同组合......有没有办法找到所有列都有“N”并替换上面相同列中的值?非常感谢!
    • 在 a[1,2:7]
    • 但这仅适用于带有“N”的行吗?我不想更改具有 7 个“N”的其他组合的行,例如 N N N N N Y N ...谢谢一百万
    • 抱歉耽搁了,我有我的工作要做:) 我编辑了所需解决方案的答案。
    • 嗨,还有一个问题......我如何计算给定列中有多少“Y”和“N”?还有一种方法可以让图表显示所有列的这些结果吗?谢谢
    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 2019-12-07
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多