Сбор значения с одинаковым именем в столбце и строке из фрейма данных - PullRequest
0 голосов
/ 30 мая 2019
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 может помочь пропустить переменную, когда она не может быть сопоставлена ​​с именем столбца.Может ли кто-нибудь помочь мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Просто переберите каждый столбец / имя строки (используя 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 
0 голосов
/ 30 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...