我是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正在保存最后一次循环观察。 任何帮助都会让我前进。
答案 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中?