Есть ли способ найти индексы общих (точно таких же) элементов в кадре данных? - PullRequest
0 голосов
/ 22 июня 2019

Учитывая данные, такие как

num <- c(5,10,15,20,25)
letter <- c("A", "B", "A", "C", "B")
thelist <- data.frame(num, letter)

Мне нужно найти индексы, где буквы одинаковы.Выходные данные:

A 1 3 
B 2 5
C 4

Затем возьмите эти индексы и найдите среднее значение этих индексов в num.Вывод:

A 10
B 17.5
C 20

Я не могу использовать циклы или if операторы, я смотрю на использование вида apply, which и т. Д.

Ответы [ 3 ]

5 голосов
/ 22 июня 2019

Поскольку цель состоит в том, чтобы найти mean для каждой подобной 'буквы', лучше сгруппировать по 'букве' и получить mean из 'num'

library(dplyr)
thelist %>% 
   group_by(letter) %>% 
   summarise(num = mean(num))
# A tibble: 3 x 2
#  letter   num
#  <fct>  <dbl>
#1 A       10  
#2 B       17.5
#3 C       20  

или в base R

aggregate(num ~ letter, thelist, mean)

Чтобы найти индекс той же самой буквы, мы можем split последовательность строк по букве

split(seq_len(nrow(thelist)), thelist$letter)
#$A
#[1] 1 3

#$B
#[1] 2 5

#$C
#[1] 4
4 голосов
/ 22 июня 2019

Другой вариант с использованием data.table:

library(data.table)

setDT(thelist)[, .(ind = paste(.I, collapse = " "),
                   mean_num = mean(num)
                   ), 
               by = letter]

Вывод:

   letter ind mean_num
1:      A 1 3     10.0
2:      B 2 5     17.5
3:      C   4     20.0
0 голосов
/ 22 июня 2019

Я бы использовал dplyr / tidyverse для этого:

# setup
library(tidyverse)
# group by letters then get mean of num
thelist %>% 
  group_by(letter) %>% 
  summarise(mean_num = mean(num))

Вы также можете использовать базу R с циклом for:

lets <- unique(thelist$letter)
x <- rep(NA, length(lets))
for(i in 1:3){
  x[i] <- mean(thelist$num[thelist$letter %in% lets[i]])
}
x
...