R表示字符变量的循环

时间:2016-08-20 08:02:09

标签: r

我是R的初学者,最近经历了一些包裹。对于练习课程,我创建了一个包含3列Part,Claimid和Cost的csv数据集。数据集如下所示: -

Part  Claimid Cost
Part1 ID1 12
Part1 ID20 29
Part2 ID21 21
Part2 ID40 13
Part3 ID41 11
Part3 ID60 10

成本列是1到10之间的随机数 我试图为每个Part运行一个循环(这里是3个部分)并使用dplyr包创建三个不同的数据帧

library(dplyr)
claimid <- read.csv(file.choose(),header = TRUE)
plist <- unique(claimid$Part) ##Create the number of loops (Here 3)
  for (i in plist) {
      plist <- claimid %>% select(Part,Claimid) %>% filter(Part %in% i)
  }

当我打印plist时,我得到了最后20个观察结果,因为显然R正在保存最后一次循环观察。 任何帮助都会让我前进。

2 个答案:

答案 0 :(得分:1)

如果我们使用list循环,我们需要创建一个for来存储输出。最好将data.frames保存在list而不是三个独立的data.frame对象中。

plist <- unique(claimid$Part) 
lst <- setNames(vector("list", length(plist)), plist)
 for (i in seq_along(plist)) {
   lst[[i]] <- claimid %>%
                  select(Part,Claimid) %>% 
                  filter(Part %in% plist[i])
}

但是,可以使用lapply

更直接地完成此操作
lst1 <- lapply(plist, function(nm) claimid %>%
                                      select(Part, Claimid) %>%
                                      filter(Part %in% nm)
                      )

但是,如果我们需要创建三个不同的data.frame对象,assign是可选的(但不推荐)

for (i in plist) {
       assign(i, claimid %>% select(Part,Claimid) %>% filter(Part %in% i))
  }


Part1
#   Part Claimid
#1 Part1     ID1
#2 Part1    ID20

Part2
#   Part Claimid
#1 Part2    ID21
#2 Part2    ID40

 Part3
#   Part Claimid
#1 Part3    ID41
#2 Part3    ID60

答案 1 :(得分:0)

如果我使用此代码`

claimid <- read.csv(file.choose(),header = TRUE) 
df <- data.frame(Part = character(),totcost = integer(),claim = integer(),stringsAsFactors = FALSE) 
plist <- unique(claimid$Part) 
for (i in plist) { assign(i, claimid %>% filter(Part %in% i) %>% group_by(Part) %>% summarise(totcost = sum(Cost), claim = n_distinct(Claimid))) 
rbind(df,i) }

我是否可以将数据集Part1,Part2和Part3一起附加到单个数据集df中?