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