将函数应用于数据框列表中的某个列

时间:2017-12-26 22:31:42

标签: r lapply

我尝试使用{将数字月份(1,2,3,4..12)转换为数据框列表mymonths中的月份缩写(请参阅df_list) {1}}并且似​​乎无法正确输出。列表中的所有数据帧都具有相同的变量。

使用下面的代码,新lapply仅包含新月份列,而原始帧中没有其他数据。对于糟糕的示例数据感到抱歉,但我认为我只是缺少一个简单的命令来获取整个原始数据集,而不仅仅是月份列。

df_list2

5 个答案:

答案 0 :(得分:1)

只需要在lapply

中输出数据帧
# create example data 
d1 <- data.frame(month = c(1:3), val = c(1,2,5))
d2 <- data.frame(month = c(1:5), val = c(1,2,5,6,8))
df_list <- list(d1, d2)

mymonths <- c("JAN","FEB","MAR",
              "APR","MAY","JUN",
              "JUL","AUG","SEP",
              "OCT","NOV","DEC")

如果月份列是指月份,那么......

df_list2 <- lapply(df_list , function(x) {
  x[,1] <- mymonths[ x[,1] ]
  x
})

df_list2

[[1]]
  month val
1   JAN   1
2   FEB   2
3   MAR   5

[[2]]
  month val
1   JAN   1
2   FEB   2
3   MAR   5
4   APR   6
5   MAY   8

如果值列指的是月份,那么......

df_list2 <- lapply(df_list , function(x) {
  x[,1] <- mymonths[ x[,2] ]
  x
})

df_list2

[[1]]
  month val
1   JAN   1
2   FEB   2
3   MAY   5

[[2]]
  month val
1   JAN   1
2   FEB   2
3   MAY   5
4   JUN   6
5   AUG   8

但是你必须在lapply

中定义的函数中输出每个data.frame

答案 1 :(得分:1)

你的'lapply`使用中存在非常小的错误。请将代码更改为:

df_list2 <- lapply(df_list , function(x) {
      x[,2] <- mymonths [ x[,2] ]
      x
 })

month列的实际值应传递给mymonths向量。因此,请通过x[,2]

还有一点是应该从函数返回x。因此增加了额外的线条。

现在df_list2的输出将是:

> df_list2
[[1]]
  month val
1     1 JAN
2     2 FEB
3     3 MAY

[[2]]
  month val
1     1 JAN
2     2 FEB
3     3 MAY
4     4 JUN
5     5 AUG

答案 2 :(得分:0)

你要找的那个词是join吗?

library(dplyr)
library(purrr)

# create example data 
df_list <- list(data.frame(month = c(1:3), val = c(1,2,5)), 
                data.frame(month = c(1:5), val = c(1,2,5,6,8)))

mymonths <- data.frame(month_name=c("JAN","FEB","MAR",
              "APR","MAY","JUN",
              "JUL","AUG","SEP",
              "OCT","NOV","DEC"),
              month=seq(12))

map(df_list,left_join, mymonths)

我们获取数据帧列表

[[1]]
  month val month_name
1     1   1        JAN
2     2   2        FEB
3     3   5        MAR

[[2]]
  month val month_name
1     1   1        JAN
2     2   2        FEB
3     3   5        MAR
4     4   6        APR
5     5   8        MAY

答案 3 :(得分:0)

只需使用Matrix函数:根据要分配给新变量的名称,您可以重写现有变量或创建一个全新的变量:

重写现有变量:

transform

答案 4 :(得分:0)

使用tidyverse包,map包中的purrr函数和基数R中的month.abb常量:

library(tidyverse)
d1 <- data.frame(month = c(1:3), val = c(1,2,5))
d2 <- data.frame(month = c(1:5), val = c(1,2,5,6,8))
df_list <- list(d1, d2)

month_abbreviation <- function(x) 
    transform(x, MonthAbb = month.abb[month])

让我们使用purrr包中的map函数迭代运行你的函数而不使用for循环

list_of_df <- map(df_list, month_abbreviation)
相关问题