This is a small example: 
a <- c("a", "b", "f", "c", "e")
b <- c("a", "c", "e", "d", "b")
p <- matrix(1:25, nrow = 5, dimnames = list(a, b))
p <- as.data.frame(p)

#data.frame would be like that
    a    c    e    d    b   
a   1    6    11   16   21     
b   2    7    12   17   22     
f   3    8    13   18   23     
c   4    9    14   19   24
e   5   10    15   20   25

Вывод чего я хочу:

  score  
a   1       
b   22                  
c   9    
e   15  

Это код, который я написал:

L <- rownames(p)
output <- NULL
t <- 1
for (i in L) {
  tar_column <- p[i]
  score <- tar_column[t, ]
  tar_score <- matrix(score, nrow = 1, dimnames = list(i, "score"))
  output <- rbind(output, tar_score)
  t <- t+1
}   

На выходе я получил:

score  
a   1       
b   22 

Error in `[.data.frame`(p, i) : undefined columns selected  

Проблема в том, что имя столбца и имя строки не совпадают идеально. Я думаю, что оператор if может помочь пропустить переменную, когда она не может быть сопоставлена с именем столбца. Может ли кто-нибудь помочь мне решить эту проблему?

r
0
Lin Yang 30 Май 2019 в 22:34

2 ответа

Лучший ответ

Просто выполните цикл по каждому столбцу / имени строки (используя sapply) и используйте обозначение в квадратных скобках для подмножества p как в этой строке, так и в столбце:

sapply(c('a','b','c','e'), function(x) p[x,x])
 a  b  c  e 
 1 22  9 15 

Если вы не хотите указывать имена переменных заранее, вы можете просто использовать colnames или rownames:

sapply(colnames(p), function(x) p[x,x])
 a  c  e  d  b 
 1  9 15 NA 22 

Если нет подходящего имени строки, будет возвращено NA для этого значения. При желании вы можете отбросить значения NA путем поднабора результата:

result <- sapply(colnames(p), function(x) p[x,x])
result[!is.na(result)]
 a  c  e  b 
 1  9 15 22 
1
divibisan 30 Май 2019 в 19:41

Вот еще один вариант:

library(tidyverse)

p %>%
  rownames_to_column("row") %>%
  gather(col, score, -row) %>%
  filter(row == col) %>%
  select(-row)
#>   col score
#> 1   a     1
#> 2   c     9
#> 3   e    15
#> 4   b    22

Сначала мы превращаем имя строки в переменную, затем собираем из широкого в длинный формат, и, наконец, мы фильтруем только совпадающие пары строк и столбцов.

0
AndS. 30 Май 2019 в 20:14