将类似变量应用于r

时间:2018-05-22 20:57:04

标签: r for-loop apply

我有6个数据从dat1到dat6,我想添加变量区域并以类似的方式标记它们,如下所示:

dat1$region <- paste("NE-1")
dat2$region <- paste("NE-2")
dat3$region <- paste("NE-3")
dat4$region <- paste("NE-4")
dat5$region <- paste("NE-5")

如何以更简洁的方式编写此代码?使用applyfor-loop? 谢谢!

3 个答案:

答案 0 :(得分:1)

将所有数据框保留在列表中,然后使用 lapply

# example dataframes
dat1 <- cars[1:2, ]
dat2 <- cars[3:4, ]
dat3 <- cars[5:6, ]

myList <- list(dat1, dat2, dat3)
# myList 
# [[1]]
#   speed dist
# 1     4    2
# 2     4   10
# 
# [[2]]
#   speed dist
# 3     7    4
# 4     7   22
# 
# [[3]]
#   speed dist
# 5     8   16
# 6     9   10

然后更容易进行重复操作。循环遍历列表,添加 region 列:

res <- lapply(seq_along(myList), function(i){
  x <- myList[[ i ]]
  x$region <- paste0("NE-", i)
  x
})

res
# [[1]]
#   speed dist region
# 1     4    2   NE-1
# 2     4   10   NE-1
# 
# [[2]]
#   speed dist region
# 3     7    4   NE-2
# 4     7   22   NE-2
# 
# [[3]]
#   speed dist region
# 5     8   16   NE-3
# 6     9   10   NE-3

答案 1 :(得分:1)

一种选择是在get中使用assignfor-loop个功能。

示例数据:

dat1 <- data.frame(id=1:4, region = letters[1:4])
dat2 <- data.frame(id=5:8, region = letters[5:8])
dat3 <- data.frame(id=9:12, region = letters[9:12])
dat4 <- data.frame(id=13:16, region = letters[13:16])
dat5 <- data.frame(id=17:20, region = letters[17:20])

dat1
#   id region
# 1  1      a
# 2  2      b
# 3  3      c
# 4  4      d

申请for-loop

for(i in 1:5){
  name = paste("dat",i,sep="")
  temp <- get(name)
  temp$region = paste("NE",i,sep = "-")
  assign(name, temp)
}

验证结果:

dat1
#   id region
# 1  1   NE-1
# 2  2   NE-1
# 3  3   NE-1
# 4  4   NE-1


dat5
#   id region
# 1 17   NE-5
# 2 18   NE-5
# 3 19   NE-5
# 4 20   NE-5

答案 2 :(得分:0)

这个怎么样(假设你的所有项目都以dat开头并以唯一标识符字符串结尾):

dat_names <- ls()[grepl("^dat", ls())]
dat_ID <- sapply(dat_names, function(d) gsub("dat", "", d))
for(d in 1:length(dat_names)) {
  dat_names[[d]]$region <- paste("NE-", dat_ID[d], sep="")
}