2017-04-20 127 views
-4

如何在第一行中将“N”的第2到第7个值替换为“Y”?第一个值保持为 “N”R根据指定的条件在多列中替换值?

 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 

我的愿望outcone是:

1  N  Y  Y  Y  Y  Y  Y 

非常感谢,

A.

回答

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更改为Y,我们只有N,所以我添加了新列,其值为FALSE和TRUE。如果行从列只有N 2:7值为FALSE becase的我们还没有我用

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 

那么任何Y.如果我们在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列的值N在roww每个值:7将与Y. 当然我们不需要柱new因此我们可以通过

b$new <- NULL 

确定删除它来代替,所以计数列occarances和barplot:

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

易ř储存卡barplot

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

enter image description here

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 
+0

谢谢!我有几百万行的“Y”和“N”的不同组合......有没有办法找到所有列都有“N”并替换上面相同列中的值?非常感谢 ! – user2017716

+0

In a [1,2:7] < - “Y”1是行数,2:7是列数。如果要在所有行中将N更改为Y,并将第2列更改为7,请键入a [,2:7] < - “Y”。 – Adamm

+0

但是,它只适用于“N”行吗?我不想改变其他组合的行,例如7“N”,例如N N N N N Y N ...谢谢千禧年 – user2017716