我试图在经验数据集中编写以下循环 每个ID复制对于每个样本周期具有不同数量的观察。 任何建议将不胜感激!
a <- unique(bma$ID)
t <- unique(bma$Sample.period)
# empty list to hold the data
dens.data <- vector(mode='list', length = length(a) * length(t))
tank1 <- double(length(a))
index = 0
for (i in 1:length(a)){
for (j in 1:length(t)){
index = index + 1
tank1[index] = a[index] ### building an ID column
temp.tank <- subset(bma, bma$ID == a[i])
time.tank <- subset(temp.tank, temp.tank$Sample.period == t[j])
temp1 <- unique(temp.tank$Sample.period)
temp.tank <- data.frame(temp.tank, temp1)
dens.1 <- density(time.tank$Biomass_.adults_mgC.mm.3, na.rm = T)
# extract the y-values from the pdf function - these need to be separated by each Replicate and Sample Period
dens.data[[index]] <- dens.1$y
}
}
#### extract the data and place into a dataframe
dens.new<- data.frame(dens.data)
dens.new
colnames(dens.new) <- c("Treatment","Sample Period","pdf/density for biomass")
all<- list(dens.new)
all
### create new spreadsheet with all the data from the loop
dens.new.data<- write.csv(dens.new, "New.density.csv") ## export file to excel spreadsheet
调用dens.new&lt; - data.frame(dens.data)产生以下错误消息:
Error in data.frame(c(...) :
arguments imply differing number of rows: 512, 0
循环似乎适用于dens.data[[1]]
但返回NULL
dens.data[[>1]]
答案 0 :(得分:0)
由于没有最小的例子,我很难猜出原始data.frame的样子。但是,对于错误消息,很明显,对于大于1的索引,您的for循环无法为列表dens.data
分配值。
我的猜测是index
没有按index = index + 1
更新。也许您可以尝试将等号=
更改为标准R赋值运算符<-
,并查看整个列表是否已更新。
我听说使用等号进行分配可能会在旧版本的R中出现一些问题,但我不确定您是否面临同样的问题。无论如何,使用<-
分配值总是更安全和推荐。