如何填充使用assign命令生成的向量中的NA条目?

时间:2015-12-27 16:35:07

标签: r

我想生成一系列向量,如india_a,india_b,india_c。这些向量的长度为3.例如,当yrs = 1且crs = a时,india_a中的第一个条目将是&total;' total'的总和。

for (i in crimes){   assign(paste("india_",i,sep=""),rep(NA,12))   
for (j in 1:12){
    india_i[j] <-sum(juvenile_crime$total[
                  juvenile_crime$year==years[j]&juvenile_crime$crime==crimes[i]]) } }

这是我在代码

上面运行时收到的消息
Error in india_i[j] <- sum(juvenile_crime$total[juvenile_crime$year == :
object 'india_i' not found

这个例子可能会有所帮助:

sts <- c(rep("s1",9),rep("s2",9))
yrs <- c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3)
crs <- c("a","b","c","a","b","c","a","b","c")
total <- c(1:18)
cri <- data.frame(sts,yrs,crs,total)
attach(cri)
yr <- levels(cri$yrs)
cr <- levels(cri$crs)
for (i in crs){   
assign(paste("india_",i,sep=""),rep(NA,3))   
for (j in 1:3){
india_i[j] <-sum(total[yrs==yr[j]&crs==cr[i]]
}
}

2 个答案:

答案 0 :(得分:1)

没有名称为“india_i”的对象。我们没有关于“犯罪”载体中的内容的任何信息,但如果它是数字1:12,那么对象的名称就像“india_1”。您应该学会制作命名列表,而不是使用单独的对象。

编辑完成后,我们可以使用稍微修改过的代码版本来演示这一点(并为dataLabels.setFormatter("'' + this.point.name + ': ' + this.percentage.toFixed(2) + '%'"); 添加缺少的括号 - 调用)。

sum

你得到全零的原因是India_L <- list() # create an (empty) master list for (i in crs){ assign(paste("india_",i,sep=""),rep(NA,3)) for (j in 1:3){ India_L[[paste("india_",j,sep="")]] <-sum(total[yrs==yr[j]&crs==cr[i]]) } } India_L # print to see the structure #---- result $india_1 [1] 0 $india_2 [1] 0 $india_3 [1] 0 - 对象的yrs列没有级别。这是“数字”,只有“因素” - 类在R中有级别。对您的策略发表评论。我不确定你为自己设定的目标(除此之外)让cri功能成功。这些逻辑测试的assign似乎没有特别丰富的信息。也许您打算使用sum运算符。将%in%与向量结合使用通常不会提供信息。

使用==通常是非常不明智的。注意你得到的警告:

attach

因此可以使用编辑更改命名的对象:

> attach(cri)
The following objects are masked _by_ .GlobalEnv:

    crs, sts, total, yrs

The following objects are masked from cri (pos = 3):

    crs, sts, total, yrs

您认为哪个对象被改变了?如果您然后 sts <- c(rep("s1.a",9),rep("s2.a",9)) - 编辑detach - 数据框,您认为编辑将驻留在哪里?附加对象的一个​​大问题是用户对实际更改内容感到困惑。

更清楚的是,在一次传递中使用数据框创建值,然后处理数据帧的组件:

cri

答案 1 :(得分:-1)

如果你想创建3个向量,你可以这样做:

for (i in unique(crs)){   
           # Note: only one of each value
   vect <- numeric(3)
           # create a help vector
   for (j in 1:3) {
      vect[j] <-sum(total[yrs==yr[j] & crs==cr[i]])
   }
   assign(paste("india_",i,sep=""), vect)
           # assign this vector to "india_i"
}

但是,这个程序不起作用。由于yrs是数字,它将按原样包含在cri数据框中,并且没有任何级别,因此yrs==yr[j]永远不会为真。

另一点:通常最好使用列表而不是india_i的赋值。我会做的

india <- vector("list", 3)
names(india) <- letters[1:3]

以后的作业就像

india[[i]] <- vect

请!!!确保您的代码运行(除了您正在努力解决的错误。)目前它甚至没有加载,因为india_i[j] <-sum(total[yrs==yr[j]&crs==cr[i]]中没有括号。