【发布时间】:2014-10-01 13:03:23
【问题描述】:
嗨,我有一个看起来像这样的数据集
bankname bankid year totass invloc1 invamt1 invloc2 invamt2 invloc3 invamt3
Bank A 1 1881 244789 Philadelphia 7250.32 New York 20218.20 Philadelphia 29513.4
Bank B 2 1881 195755 Pittsburgh 10243.60 NA 1851.51 NA NA
Bank C 3 1881 107736 New York 13357.80 Wilkes-Barre 17761.20 NA NA
Bank D 4 1881 170600 Philadelphia 3.35 Philadelphia 2.00 NA NA
Bank E 5 1881 32000000 New York 351266.00 New York 314012.00 NA
但我想为每个银行使用 invloc 和 invamt 变量创建一个名为 NY_tot 的新变量。对于每家银行,如果他们的 invloc 是纽约,那么总和 invamt。 invloc1 和 invamt1 一起去。因此,我希望这个数据集看起来像这样。
bankname bankid year totass invloc1 invamt1 invloc2 invamt2 invloc3 invamt3 NY_tot
Bank A 1 1881 244789 Philadelphia 7250.32 New York 20218.20 Philadelphia 29513.4 20218.20
Bank B 2 1881 195755 Pittsburgh 10243.60 NA 1851.51 NA NA 0
Bank C 3 1881 107736 New York 13357.80 Wilkes-Barre 17761.20 NA NA 13357.80
Bank D 4 1881 170600 Philadelphia 3.35 Philadelphia 2.00 NA NA 0
Bank E 5 1881 32000000 New York 351266.00 New York 314012.00 NA 665278
这是我正在使用的数据集
bankname <- c("Bank A","Bank B","Bank C","Bank D","Bank E")
bankid <- c( 1, 2, 3, 4, 5)
year<- c( 1881, 1881, 1881, 1881, 1881)
totass <- c(244789, 195755, 107736, 170600, 32000000)
invloc1 <-c("Philadelphia","Pittsburgh","New York","Philadelphia","New York")
invamt1<-c(7250.32,10243.6,13357.8,3.35,351266)
invloc2<-c("New York","NA","Wilkes-Barre","Philadelphia","New York")
invamt2<-c(20218.2,1851.51,17761.2,2,314012)
invloc3<-c("Philadelphia","NA","NA","NA","")
invamt3<-c(29513.4,NA,NA,NA,NA)
bankdata<-data.frame(bankname, bankid,year,totass, invloc1, invamt1, invloc2, invamt2, invloc3, invamt3)
当我尝试以下代码时:
将因子变量(invloc)更改为字符
i <- sapply(bankdata, is.factor)
bankdata[i] <- lapply(bankdata[i], as.character)
然后新建一个变量
for(i in 1:nrow(bankdata)){
bankdata$NY_tot<-0
for(j in 1:3){
if((!is.na(bankdata[i,paste("invloc",j,sep="")])) && (bankdata[i,paste("invloc",j,sep="")]=="New York")){
if (!is.na(bankdata[i,paste("invamt",j,sep="")])){
bankdata$NY_tot[i]<-bankdata$NY_tot[i]+bankdata[i,paste("invamt",j,sep="")]
}
}
}
}
我在NY_tot 变量中得到 0。你能告诉我为什么吗?
提前谢谢你!
【问题讨论】:
-
因为您为每一行重新定义了
bankdata$NY_tot<-0。您可能希望在循环之外执行此操作。 -
您正在使用
for循环,您应该使用矢量化。这会导致代码变慢。 -
我怎样才能更有效地做到这一点?你能给我示例代码吗?谢谢大家。
-
这可能可以用 ifelse 解决,但是,您的数据框缺少 invamt 列,我无法真正弄清楚您想要什么,所以我无法用您上面的信息提供答案.
-
我认为出于安全考虑,您应该使用
lapply(bankdata[i], function(x) as.character(x))而不是lapply(bankdata[i], as.character)