Та же функция над несколькими кадрами данных в R

StackOverflow https://stackoverflow.com//questions/22002838

  •  20-12-2019
  •  | 
  •  

Вопрос

Я новый до 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
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top