根据名称循环数据框

时间:2013-07-03 06:46:36

标签: r loops

我有另一个简单的问题,希望有人可以提供帮助。我有一系列具有重复名称结构的数据帧。我想循环遍历它们并执行一些分析。这是我想用虚假数据做的事情的硬编码示例:

#Create some fake data
n1 = c(2, 3, 5, 7) 
s1 = c(1, 1, 2, 0) 
b1 = c(6, 0, 0, 0) 
Tank001.df = data.frame(n1, s1, b1)

n2 = c(1, 2, 4, 6) 
s2 = c(2, 2, 0, 0) 
b2 = c(8, 9, 10, 0) 
Tank002.df = data.frame(n2, s2, b2)

n3 = c(7, 12, 0, 0) 
s3 = c(5, 3, 0, 0) 
b3 = c(8, 9, 10, 4) 
Tank003.df = data.frame(n3, s3, b3)

我想要自动化的第一个操作是将0值转换为“NA”。这是harcoded版本,但理想情况下我会根据我有多少Tankxxx.df数据帧自动执行此操作:

#Convert zeros to NA
Tank001.df[Tank001.df==0] <- NA
Tank002.df[Tank002.df==0] <- NA
Tank003.df[Tank003.df==0] <- NA

最后,我想完成一系列数据查询,其中一个简单的例子可能是每个数据帧中小于5的值的数量:

#Return the number of values smaller than 5
Tank001.less.than.5 <- numeric(length(Tank001.df))
for (i in 1:(length(Tank001.df))) {Tank001.less.than.5[i] <- sum(Tank001.df[[i]] < 5,na.rm=TRUE)} 
Tank002.less.than.5 <- numeric(length(Tank002.df))
for (i in 1:(length(Tank002.df))) {Tank002.less.than.5[i] <- sum(Tank002.df[[i]] < 5,na.rm=TRUE)} 
Tank003.less.than.5 <- numeric(length(Tank003.df))
for (i in 1:(length(Tank003.df))) {Tank003.less.than.5[i] <- sum(Tank003.df[[i]] < 5,na.rm=TRUE)} 

理想情况下,我还想知道如何将这种简单计算的结果写入新的数据帧。在这种情况下,例如Less.than.5 $ TankXXX等。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

创建list data.framelapply并使用sapplyTankList <- list(Tank001.df, Tank002.df, Tank003.df) lapply(TankList, function(x) { x[x == 0] <- NA sapply(x, function(y) sum(y < 5, na.rm = TRUE)) }) # [[1]] # n1 s1 b1 # 2 3 0 # # [[2]] # n2 s2 b2 # 3 2 0 # # [[3]] # n3 s3 b3 # 0 1 1 的组合,如下所示:

{{1}}

答案 1 :(得分:3)

这也适用于单个lapplycolSums

l <- list(Tank001.df, Tank002.df, Tank003.df) # create a list

lapply(l, function(x) colSums("is.na<-"(x, !x) < 5, na.rm = TRUE))

# [[1]]
# n1 s1 b1 
#  2  3  0 
# 
# [[2]]
# n2 s2 b2 
#  3  2  0 
# 
# [[3]]
# n3 s3 b3 
#  0  1  1 
相关问题