ループとして書き直し、Rで、同様のデータフレームの選択された変数を因子として設定します

Nov 24 2020

私は何年ものデータを持っており、それぞれが同じデータフレームにあります。すべての年をリストに入れてから、毎年コマンドを繰り返すのではなく、forループを1つ作成したいと思います。

#set dummies as factors (these dummies repeat across years)
mydummies<-c ('hru_i', 'ge_nonngsother_i','ge_sgt_i')
DF2012[,mydummies]<-lapply(DF2012[,mydummies],factor)
DF2013[,mydummies]<-lapply(DF2013[,mydummies],factor)

ループを実行できるようにすべてのデータフレームをリストに入れようとしましたが、データフレームは変更されませんでした...

df.list<- list(DF2012,DF2013)
#want to create a loop here

回答

1 GregorThomas Nov 24 2020 at 20:12

ネストlapplyはこれで機能します:

df.list <- lapply(df.list, function(d) {
  d[mydummies] <- lapply(d[mydummies], factor)
  d
})

これは、それが機能することを示す再現可能な例です。

df.list = list(a = head(mtcars), b = head(mtcars))
mydummies = c("cyl", "am")
sapply(df.list, sapply, class)
#      a         b        
# mpg  "numeric" "numeric"
# cyl  "numeric" "numeric"
# disp "numeric" "numeric"
# hp   "numeric" "numeric"
# drat "numeric" "numeric"
# wt   "numeric" "numeric"
# qsec "numeric" "numeric"
# vs   "numeric" "numeric"
# am   "numeric" "numeric"
# gear "numeric" "numeric"
# carb "numeric" "numeric"

df.list <- lapply(df.list, function(d) {
  d[mydummies] <- lapply(d[mydummies], factor)
  d
})

#      a         b        
# mpg  "numeric" "numeric"
# cyl  "factor"  "factor" 
# disp "numeric" "numeric"
# hp   "numeric" "numeric"
# drat "numeric" "numeric"
# wt   "numeric" "numeric"
# qsec "numeric" "numeric"
# vs   "numeric" "numeric"
# am   "factor"  "factor" 
# gear "numeric" "numeric"
# carb "numeric" "numeric"
1 akrun Nov 24 2020 at 20:24

使用できます tidyverse

library(dplyr)
library(purrr)
df.list <- map(df.list, ~ .x %>% 
                    mutate(across(all_of(mydummies), factor)))

データ

df.list <- list(a = head(mtcars), b = head(mtcars))
mydummies <- c("cyl", "am")