【问题标题】:How can I create a function or a loop over dataframe names in R?如何在 R 中创建函数或循环数据框名称?
【发布时间】:2017-12-05 16:11:45
【问题描述】:

我是一名新程序员,我一直坚持创建函数或循环以避免重复行。

这是我的部分代码:

# Importing dataframes
R1 <- read.table("C:/Users/Data1.txt", header = TRUE)
R2 <- read.table("C:/Users/Data2.txt", header = TRUE)
R3 <- read.table("C:/Users/Data3.txt", header = TRUE)

# Taking only the colunms that I need from each dataframe
R1_dados <- R1[,c(1,8,11,14,24)]
R2_dados <- R2[,c(1,8,11,14,24)]
R3_dados <- R3[,c(1,8,11,14,24)]

# Adding some colunms 
R1_dados$E <- c(0,100,200,300,400,500,600)
R2_dados$E <- c(0,100,200,300,400,500,600)
R3_dados$E <- c(0,100,200,300,400,500,600)

# Doing some math between columns from each dataframe
R1_dados$rETR = R1_dados$fvfm*R1_dados$E
R2_dados$rETR = R2_dados$fvfm*R2_dados$E
R3_dados$rETR = R3_dados$fvfm*R3_dados$E

# and so on...

我想知道是否可以创建副本(R1、R2 和 R3)的索引

如果有人帮助我,我将不胜感激。谢谢!

【问题讨论】:

  • 如果操作非常相似,您可以将R1 - R3 存储在一个列表中,然后每个操作都变成一个简单的lapply。比如:R_list &lt;- list(R1, R2, R3); R_list_dados &lt;- lapply(R_list, "[", c(1,8,11,14,24); R_list_dados2 &lt;- lapply(R_list_dados, function(x) x$E &lt;- c(0,100,200,300,400,500,600))等等
  • 你要不要保留R1、R2...?
  • 参见How do I make a list of data frames 了解一些讨论和示例。
  • 是的,我确实需要保留 R1、R2... 另外,在后面的代码中,我需要为每个列创建一个具有不同值的列。

标签: r function for-loop lapply


【解决方案1】:

你应该循环一个文件列表。

fileList <- c("Data1", "Data2", "Data3")
for (file in fileList){
  R <- read.table(paste0("C:/Users/", file, ".csv"))
  R_dados <- R[,c(1,8,11,14,24)]
  R_dados$E <- c(0,100,200,300,400,500,600)
  R_dados$rETR = R_dados$fvfm*R3_dados$E
  write.table(R_dados, file = paste0("C:/Users/", file, "_dados.csv"))
}

【讨论】:

  • 我同意@Emmanuel-Lin。此外,如果您不想创建新的输出文件,而只想将它们导入单个数据帧,则可以使用 df &lt;- NULL 初始化数据帧(如果您有 options(stringsAsFactors=F))并使用 rbind() 附加到 df .
  • 它有效,但我需要保留索引以包含每个索引的其他值。
  • 索引是指来自 Data1、Data2、Data3... 的 1,2,3..?如果是这样,请解析您的文件名以获取它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多