Извлечь элементы из data.frame, используя их координаты

Я пытаюсь расширить ответ из Найти строку в data.frame и Найти несколько строк во всем фрейме данных.

Как я могу использовать результаты согласований для извлечения соответствующих элементов data.frame? Здесь под результатами подразумеваются результаты из which() с arr.ind = TRUE или sapply()

mat = as.data.frame(matrix(1:9, nrow = 3))
mat[1, 3] = "12:14"
mat[2, 1] = "18:48"
mat[2, 2] = "10:10"


# using the "which()" option
which(mat == "10:10", arr.ind = TRUE)

# the expected result is (may be in a vector type):
# > "18:48"

# using the "sapply()" option
sapply(colnames(mat), function(x) grep(":", mat[, x]))

# the expected result is (may be in a vector type):
# > "18:48", "10:10", "12:14"

# if I use grepl() rather than grep()
text = mat[sapply(colnames(mat), function(x) grepl(":", mat[, x])), ]

# I get an unexpected result as:
# > text
#         V1    V2   V3
# 2    18:48 10:10    8
# NA    <NA>  <NA> <NA>
# NA.1  <NA>  <NA> <NA>

person htlee    schedule 08.10.2019    source источник


Ответы (2)


Мы можем использовать grep с value = TRUE после преобразования mat в матрицу

grep(":", as.matrix(mat), value = TRUE)
#[1] "18:48" "10:10" "12:14"
person Ronak Shah    schedule 08.10.2019
comment
Спасибо за ваш ответ. Однако ваш ответ несколько далек от того, что я хочу знать, потому что я сначала не включил пример кода и подробное объяснение, извините. Я только что добавил их. - person htlee; 08.10.2019
comment
Благодарю вас! Это также отличный и простой ответ для результата с sapply(). - person htlee; 08.10.2019
comment
В этом случае вам не понадобится sapply, так как я преобразовал mat в матрицу, он будет искать шаблон : во всех данных и возвращать те, которые соответствуют. - person Ronak Shah; 08.10.2019
comment
Да, ваш ответ можно считать ответом на результат с sapply(), но не требует использования функции. Хорошо. - person htlee; 08.10.2019

Ты так близок к последнему; вы просто хотите использовать матричную индексацию, передав ей всю матрицу, а не только строки (т. е. у вас есть лишняя запятая).

> mat[sapply(colnames(mat), function(x) grepl(":", mat[, x]))]
[1] "18:48" "10:10" "12:14"

В сравнении с

> mat[sapply(colnames(mat), function(x) grepl(":", mat[, x])),]
        V1    V2   V3
2    18:48 10:10    8
NA    <NA>  <NA> <NA>
NA.1  <NA>  <NA> <NA>
person Aaron left Stack Overflow    schedule 08.10.2019
comment
Спасибо. У вас есть правильный ответ для применения результата с sapply(). Я не осознавал разницы между индексированием с помощью матрицы и индексированием строк. - person htlee; 08.10.2019
comment
Спасибо за проверку, но это действительно долгий путь; см. ответ @RonakShah для более простого способа. Вы можете изменить принятый ответ, если согласны. - person Aaron left Stack Overflow; 08.10.2019
comment
Я согласен с обоими ответами. Тем не менее, я принял ваше, потому что оно загружено первым. Однако, как вы говорите, я изменю принятый ответ (ваш тоже отличный). - person htlee; 08.10.2019