R根据指定条件替换乘法列中的值?

R Replace values in multiply columns based on specified condition?

如何将第一行中 "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

非常感谢,

A​​.

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 的新列。如果行只有 2:7 列中的 N,则值为 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

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

删除它
b$new <- NULL

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

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

Easy R 构建条形图

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