给出一个数据框,例如
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
等这类
答案 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