有没有一种方法可以找到数据帧中常见(完全相同)元素的索引?

时间:2019-06-22 18:29:57

标签: r dataframe indexing group-by

给出一个数据框,例如

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语句,我正在使用applywhich等这类

3 个答案:

答案 0 :(得分:5)

由于目标是为每个相似的“字母”找到mean,因此最好按“字母”分组并获得“ num”的mean

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用“字母” {p}

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

#$B
#[1] 2 5

#$C
#[1] 4

答案 1 :(得分:4)

另一个使用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

答案 2 :(得分:0)

为此,我将使用dplyr / tidyverse:

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

您也可以将base 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