R: Сортировка столбцов в Dataframe на основе связанных значений? - PullRequest
0 голосов
/ 07 мая 2018

Предположим, у меня есть такой фрейм данных:

df <- data.frame(First_Name=c("John","Alex","James","John","Alex","John","James"),
             Last_Name = c("Smith","Smith","Jones","Jones","Johnson","Ryan","Murphy"),
             Frequency = c(4,7,8,9,3,10,4))

  First_Name Last_Name Frequency
1       John     Smith         4
2       Alex     Smith         7
3      James     Jones         5
4       John     Jones         9
5       Alex   Johnson         3
6       John      Ryan        10
7      James    Murphy         4

и я хотел бы свернуть первый столбец (Имя) только в уникальные значения и отсортировать имя по их совокупной частоте. Для этого примера, если мы сделаем это и отсортируем в порядке убывания, порядок будет следующим: Джон, Джеймс, Алекс, поскольку их соответствующие кумулятивные частоты равны 23, 10 и 12.

Исходя из фона Python, я думал о сохранении значений в кортеже, но я не уверен, есть ли эквивалент в R (на данный момент я знаком только с векторами).

Кроме того, если я попытаюсь извлечь только уникальные значения из столбца «First_Name» и сохранить его в векторе:

unique(c(df$First_Name))

R выводит это:

[1] 3 1 2

, который, кажется, указывает, что они преобразовали имена в целые числа.

Итак, мои вопросы:

1) Как мне получить только уникальные имена и отсортировать их по совокупным значениям?

2) Почему R преобразует имена в целые числа, если я пытаюсь сохранить их в векторе?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы можете попробовать tidyverse решение

library(tidyverse)
df %>% 
  group_by(First_Name) %>% 
  summarise(Sum=sum(Frequency))
# A tibble: 3 x 2
  First_Name   Sum
  <fct>      <dbl>
1 Alex          10
2 James         12
3 John          23
0 голосов
/ 07 мая 2018

R по умолчанию меняет символы на факторы, что может раздражать. Вы можете проверить это командой:

str(df)

Который показывает

'data.frame':   7 obs. of  3 variables:
 $ First_Name: Factor w/ 3 levels "Alex","James",..: 3 1 2 3 1 3 2
 $ Last_Name : Factor w/ 5 levels "Johnson","Jones",..: 5 5 2 2 1 4 3
 $ Frequency : num  4 7 8 9 3 10 4

Если вы добавите флаг stringsAsFactors, вы избежите этого:

df <- data.frame(First_Name=c("John","Alex","James","John","Alex","John","James"),
             Last_Name = c("Smith","Smith","Jones","Jones","Johnson","Ryan","Murphy"),
             Frequency = c(4,7,8,9,3,10,4), stringsAsFactors = FALSE)
str(df)
'data.frame':   7 obs. of  3 variables:
 $ First_Name: chr  "John" "Alex" "James" "John" ...
 $ Last_Name : chr  "Smith" "Smith" "Jones" "Jones" ...
 $ Frequency : num  4 7 8 9 3 10 4

Но в любом случае вы можете группировать по уникальным и использовать любую функцию из этого подмножества, используя агрегат:

aggregate(Frequency ~ First_Name, data=df, FUN="sum")
  First_Name Frequency
1       Alex        10
2      James        12
3       John        23

Таблица может быть переупорядочена с помощью функции заказа

out <- out[rev(order(out$Frequency)),]
  First_Name Frequency
3       John        23
2      James        12
1       Alex        10

Если вы хотите изменить порядок первой таблицы по совокупному итогу, оставив ее в прежнем виде, вам нужно будет выполнить слияние.

out$rank <- 1:nrow(out)
new <- merge(df, out, by.x='First_Name', by.y='First_Name')
final <- new[order(new$rank),]

  First_Name Last_Name Frequency.x Frequency.y rank
1       Alex     Smith           7          10    1
2       Alex   Johnson           3          10    1
3      James     Jones           8          12    2
4      James    Murphy           4          12    2
5       John     Smith           4          23    3
6       John     Jones           9          23    3
7       John      Ryan          10          23    3

Тогда просто отбросьте ненужные столбцы.

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