Та же функция над несколькими кадрами данных в R
Вопрос
Я новый до r, и это очень простой вопрос.Я нашел много похожих на то, что я хочу, но не совсем это.По сути, у меня есть несколько кадров данных, и я просто хочу запустить ту же функцию по всему их всему.For-Loop может работать, но я не уверен, как правильно настроить его для вызова кадров данных.Также, кажется, наиболее предпочитают подход кляпп с R. Я играл с функцией Get, а также безрезультатно.Я прошу прощения, если это дублированный вопрос.Любая помощь была бы очень ценится!
Вот мой упрощенный пример: 2 Рамы данных: DF1, DF2
df1
start stop ID
0 10 x
10 20 y
20 30 z
df2
start stop ID
0 10 a
10 20 b
20 30 c
.
Что я хочу, это 4-й столбец со средним запусками и остановкой для обеих DFS
df1
start stop ID Avg
0 10 x 5
10 20 y 15
20 30 z 25
.
Я могу сделать этот кадр данных одновременно с:
df1$Avg <- rowMeans(subset(df1, select = c(start, stop)), na.rm = TRUE)
.
Но я хочу запустить его на всех данных данных.
Решение
Создайте список кадров данных, затем используйте Lapply, чтобы применить функцию для них все.
df.list <- list(df1,df2,...)
res <- lapply(df.list, function(x) rowMeans(subset(x, select = c(start, stop)), na.rm = TRUE))
# to keep the original data.frame also
res <- lapply(df.list, function(x) cbind(x,"rowmean"=rowMeans(subset(x, select = c(start, stop)), na.rm = TRUE)))
.
Lapply затем подают в кадр данных в виде X последовательно.
Другие советы
Положите их в список, а затем запустите rowMeans
по списку.
df1 <- data.frame(x = rep(3, 5), y = seq(1, 5, 1), ID = letters[1:5])
df2 <- data.frame(x = rep(5, 5), y = seq(2, 6, 1), ID = letters[6:10])
lapply(list(df1, df2), function(w) { w$Avg <- rowMeans(w[1:2]); w })
[[1]]
x y ID Avg
1 3 1 a 2.0
2 3 2 b 2.5
3 3 3 c 3.0
4 3 4 d 3.5
5 3 5 e 4.0
[[2]]
x y ID Avg
1 5 2 f 3.5
2 5 3 g 4.0
3 5 4 h 4.5
4 5 5 i 5.0
5 5 6 j 5.5
. Если вы хотите, чтобы все выходы в одном файле это может помочь.
df1 <- data.frame(x = rep(3, 5), y = seq(1, 5, 1), ID = letters[1:5])
df2 <- data.frame(x = rep(5, 5), y = seq(2, 6, 1), ID = letters[6:10])
z=list(df1,df2)
df=NULL
for (i in z) {
i$Avg=(i$x+i$y)/2
df<-rbind(df,i)
print (df)
}
> df
x y ID Avg
1 3 1 a 2.0
2 3 2 b 2.5
3 3 3 c 3.0
4 3 4 d 3.5
5 3 5 e 4.0
6 5 2 f 3.5
7 5 3 g 4.0
8 5 4 h 4.5
9 5 5 i 5.0
10 5 6 j 5.5
.