也许for-loop会起作用?例如.
Tab1 <- read.table(text = "
nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
1 E_A6 3 3 0 0 0 0 0 0 0 0 1
2 E_A6 4 3 NA NA NA NA NA NA NA NA NA
3 E_A6 5 3 NA NA NA NA NA NA NA NA NA
4 E_AL 3 3 0 5 0 0 0 0 0 0 1
5 E_AL 4 3 NA NA NA NA NA NA NA NA NA
6 E_AL 5 3 NA NA NA NA NA NA NA NA NA
", header = TRUE, check.names = FALSE)
for (i in 1:nrow(Tab1)) {
if (Tab1[i,2] == Tab1[i,3]) {
stored_line <- Tab1[i,4:12]
}
if (all(is.na(Tab1[i,4:12]))) {
Tab1[i,4:12] <- stored_line
Tab1[i,2] <- NA
}
}
Tab1
#> nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
#> 1 E_A6 3 3 0 0 0 0 0 0 0 0 1
#> 2 E_A6 NA 3 0 0 0 0 0 0 0 0 1
#> 3 E_A6 NA 3 0 0 0 0 0 0 0 0 1
#> 4 E_AL 3 3 0 5 0 0 0 0 0 0 1
#> 5 E_AL NA 3 0 5 0 0 0 0 0 0 1
#> 6 E_AL NA 3 0 5 0 0 0 0 0 0 1
我try 使用连接,但无法确定边缘情况,例如,如果一行具有Nas和值:
# add some sevens to line 2
Tab1 <- read.table(text = "
nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
1 E_A6 3 3 0 0 0 0 0 0 0 0 1
2 E_A6 4 3 NA NA NA NA NA NA NA 7 7
3 E_A6 5 3 NA NA NA NA NA NA NA NA NA
4 E_AL 3 3 0 5 0 0 0 0 0 0 1
5 E_AL 4 3 NA NA NA NA NA NA NA NA NA
6 E_AL 5 3 NA NA NA NA NA NA NA NA NA
", header = TRUE, check.names = FALSE)
# solution from @thelatemail's comment:
library(tidyverse)
Tab1 %>% select(nodepair,ES2) %>% left_join(Tab1 %>% filter(ES1 == ES2), by=c("nodepair","ES2"))
#> nodepair ES2 ES1 ++ -- +- -+ 0+ +0 0- -0 00
#> 1 E_A6 3 3 0 0 0 0 0 0 0 0 1
#> 2 E_A6 3 3 0 0 0 0 0 0 0 0 1
#> 3 E_A6 3 3 0 0 0 0 0 0 0 0 1
#> 4 E_AL 3 3 0 5 0 0 0 0 0 0 1
#> 5 E_AL 3 3 0 5 0 0 0 0 0 0 1
#> 6 E_AL 3 3 0 5 0 0 0 0 0 0 1
# compared to the for-loop approach
for (i in 1:nrow(Tab1)) {
if (Tab1[i,2] == Tab1[i,3]) {
stored_line <- Tab1[i,4:12]
}
if (all(is.na(Tab1[i,4:12]))) {
Tab1[i,4:12] <- stored_line
Tab1[i,2] <- NA
}
}
Tab1
#> nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
#> 1 E_A6 3 3 0 0 0 0 0 0 0 0 1
#> 2 E_A6 4 3 NA NA NA NA NA NA NA 7 7
#> 3 E_A6 NA 3 0 0 0 0 0 0 0 0 1
#> 4 E_AL 3 3 0 5 0 0 0 0 0 0 1
#> 5 E_AL NA 3 0 5 0 0 0 0 0 0 1
#> 6 E_AL NA 3 0 5 0 0 0 0 0 0 1
创建于2024-02-06年第reprex v2.1.0页