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 ответа
Просто выполните цикл по каждому столбцу / имени строки (используя 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
Вот еще вариант:
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
Сначала мы превращаем имя строки в переменную, затем собираем из широкого в длинный формат, и, наконец, мы фильтруем только совпадающие пары строк и столбцов.
Похожие вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.