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]. 问题是,如何同时对所有列执行此操作?我有办法解决这个问题吗?
谢谢
用于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)