Поиск индекса или уникальных значений из столбца данных - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть фрейм данных

TableName Function Argument
A         func1    3
B         func1    4
A         func2    6
B         func2    2
C         func1    5

Я хочу сначала узнать уникальное имя таблицы в фрейме данных, которое просто с помощью уникальной функции.Однако мне также нужны индексы уникальных, сопоставленных со значением. Что-то вроде:

TableName Index
A         1 3
B         2 4
C         5

Позже я хочу прочитать этот вывод, чтобы получить уникальное значение TableName (например, A), а затем использовать каждый индекс, соответствующийЭто один за другим (1, а затем 3), чтобы выполнить некоторые операции.

Пожалуйста, предложите мне подход.

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Нет необходимости в любой упаковке.Попробуйте:

aggregate(rownames(df) ~ TableName, df, c)
  TableName rownames(df)
1         A         1, 3
2         B         2, 4
3         C            5
# or
setNames(aggregate(rownames(df) ~ TableName, df, c),
         c("TableName", "Index"))
  TableName Index
1         A  1, 3
2         B  2, 4
3         C     5
0 голосов
/ 20 декабря 2018

Вот решение dplyr, в котором мы создаем переменную с row_number() и используем ее в качестве индекса, то есть

df %>% 
 mutate(new = row_number()) %>% 
 group_by(TableName) %>% 
 summarise(Index = toString(new))

, которая дает

# A tibble: 3 x 2
  TableName Index
  <fct>     <chr>
1 A         1, 3 
2 B         2, 4 
3 C         5    

Вы также можете сохранить их как списки, а не строки, что облегчит будущие операции, например,

df %>% 
 mutate(new = row_number()) %>% 
 group_by(TableName) %>% 
 summarise(Index = list(new))

, что дает

# A tibble: 3 x 2
  TableName Index    
  <fct>     <list>   
1 A         <int [2]>
2 B         <int [2]>
3 C         <int [1]>
0 голосов
/ 20 декабря 2018

Использование data.table:

setDT(data)[, .(Index = toString(.I)), TableName]
   TableName Index
1:         A  1, 3
2:         B  2, 4
3:         C     5
0 голосов
/ 20 декабря 2018

Я бы предложил использовать просто

(vec <- tapply(df$Argument, df$TableName, FUN = `identity`))
# $A
# [1] 3 6
#
# $B
# [1] 4 2
#
# $C
# [1] 5

или

(dfNew <- data.frame(TableName = unique(df$TableName), Index = vec))
#   TableName Index
# A         A  3, 6
# B         B  4, 2
# C         C     5

vec - это список (а не символ с объединенными числами) с легким доступом к names(vec) и, например,

vec$A
# [1] 3 6

, тогда как dfNew - это фрейм данных, второй столбец которого также является списком:

dfNew[2]
#   Index
# A  3, 6
# B  4, 2
# C     5

dfNew[,2]
# [[1]]
# [1] 3 6
#
# [[2]]
# [1] 4 2
#
# [[3]]
# [1] 5

dfNew[2]["A",][[1]]
# [1] 3 6

В этом случае, однако, это не так удобночтобы достичь индексов на TableName, поэтому я бы придерживался vec.

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