如何在R中的所有列中应用“for循环”?

iva*_*nge 2 for-loop if-statement r multiple-columns

我有这些数据和我创建的for,用于根据条件(if)转换列中的所有元素。(我知道还有更多方法可以做到这一点......)

这里是:

S1 <- c(0,1,1,0,0,2,2,1,1,1,1,1,0)
S2 <- c(2,1,0,1,0,2,1,1,0,1,2,2,1)
S3 <- c(0,1,0,0,1,2,0,1,2,1,2,0,2)
S4 <- c(2,1,0,2,1,2,2,1,2,1,2,2,0)

df <- data.frame(S1,S2,S3,S4)

for (i in 1:nrow(df)){
  if(df[i,1] == 0){
    df[i,1] <- "A/A"
  }
  if(df[i,1] == 1){
    df[i,1] <- "A/T"
  }
  if(df[i,1] == 2){
    df[i,1] <- "T/T"
  }
  if(df[i,1] == "NaN"){
    df[i,1] <- 0
  }
}
Run Code Online (Sandbox Code Playgroud)

这是实际情况:

S1  S2  S3  S4
0   2   0   2
1   1   1   1
1   0   0   0
Run Code Online (Sandbox Code Playgroud)

当我运行for时,它仅适用于第一列,因为我描述了df[i,1]. 问题是,如何同时对所有列执行此操作?我有办法解决这个问题吗?

谢谢

Jil*_*ina 5

用于sapply迭代列,然后应用逻辑比较==来查找和替换。

sapply(df, function(x){
  x[x==0] <- "A/A";
  x[x==1] <- "A/T";
  x[x==2] <- "T/T";
  x[x=="NaN"] <- 0;
  x
})
Run Code Online (Sandbox Code Playgroud)

这会产生:

      S1    S2    S3    S4   
 [1,] "A/A" "T/T" "A/A" "T/T"
 [2,] "A/T" "A/T" "A/T" "A/T"
 [3,] "A/T" "A/A" "A/A" "A/A"
 [4,] "A/A" "A/T" "A/A" "T/T"
 [5,] "A/A" "A/A" "A/T" "A/T"
 [6,] "T/T" "T/T" "T/T" "T/T"
 [7,] "T/T" "A/T" "A/A" "T/T"
 [8,] "A/T" "A/T" "A/T" "A/T"
 [9,] "A/T" "A/A" "T/T" "T/T"
[10,] "A/T" "A/T" "A/T" "A/T"
[11,] "A/T" "T/T" "T/T" "T/T"
[12,] "A/T" "T/T" "A/A" "T/T"
[13,] "A/A" "A/T" "T/T" "A/A"
Run Code Online (Sandbox Code Playgroud)

如果你想替换df并保留data.frame结构,那么使用lapply

df[,] <- lapply(df, function(x){
  x[x==0] <- "A/A";
  x[x==1] <- "A/T";
  x[x==2] <- "T/T";
  x[x=="NaN"] <- 0;
  x
})
Run Code Online (Sandbox Code Playgroud)