R:错误添加列,错误分类实例

时间:2015-10-31 13:11:07

标签: r

我有一个R分配,我必须在我的矩阵中添加一列。这是关于日期(时区),我使用dplyrlubridate库。

所以我想从下表中根据state列添加OlsonName(即NSW - > Australia / NSW)

    Event.ID  Database     Date.Time      Nearest.town  State   *OlsonName*
1    20812     Wind     23/11/1975 07:00    SYDNEY       NSW  *Australia/NSW*
2    20813    Tornado   02/12/1975 14:00    BARHAM       NSW  *Australia/NSW*

我用函数和循环来实现它:

#function 
addOlsonNames <- function(aussieState,aussieTown){
 if(aussieState=="NSW"){
  if(aussieTown=="BROKEN HILL"){
    value <- "Australia/Broken_Hill";
  }else{
    value <- "Australia/NSW"
 }
 }else if(aussieState=="QLD"){
  value <- "Australia/Queensland"
 }else if(aussieState=="NT"){
  value <- "Australia/North"
 }else if(aussieState=="SA"){
  value <- "Australia/South"
 }else if(aussieState=="TAS"){
  value <- "Australia/Tasmania"
 }else if(aussieState=="VIC"){
  value <- "Australia/Victoria"
 }else if(aussieState=="WA"){
  value <- "Australia/West"
 }else if(aussieState=="ACT"){
  value <- "Australia/ACT"
 }
 else{
  value <- "NAN"
 }
 return(value)
}

#loop
for(i in 1:nrow(aussieStorms)){
 aussieStorms$OlsonName[i] <- addOlsonNames(State[i],Nearest.town[i])
}

大多数实例都像上面的表一样被正确分类,但有些实例被错误分类(即State~TAS - &gt; OlsonName~Australia/West。尽管我有一些State~TAS - &gt; OlsonName~Australia/Tasmania)。

对我来说似乎很奇怪。可能是什么问题?

更新: 我也试过mutate(),这就是我得到的:

 aus1 <- mutate(aussieStorms,OlsonXYZ = addOlsonNames(State,Nearest.town))

 Warning messages:
  1: In if (aussieState == "NSW") { :
  the condition has length > 1 and only the first element will be used
  2: In if (aussieTown == "BROKEN HILL") { :
  the condition has length > 1 and only the first element will be used

1 个答案:

答案 0 :(得分:1)

如果Ben Bolker的评论是正确的,那么问题就在这里:

for(i in 1:nrow(aussieStorms)){
 aussieStorms$OlsonName[i] <- addOlsonNames(State[i],Nearest.town[i])
}

因为传递给addOlsonNames的值而不是来自aussieStorms数据帧的行。如果R没有给出错误,那么它必须从R工作区中名为State[i]的另一个对象获取State。同样适用于Nearest.town。如果这些对象与aussieStorms数据框中的对象不同,则可以解释明显的错误分类。

[也有可能您在某个时刻在数据框架上使用了attach,并且State正在从中获取attach。但aussieStorms$State数据框是一个坏主意,你可以在这里看到......]

Ben的解决方案,即让他们aussieStorms$Nearest.townImports System.Net.Mail Imports System.IO Public MustInherit Class Email Public Property TheMailMessage As MailMessage Protected MustOverride Property SendFrom As MailAddress Protected MessageTemplate As StreamReader Protected DataModel As Dictionary(Of String, String) Protected BodyContent As String Protected Function GenerateMessageBody() As String BodyContent = MessageTemplate.ReadToEnd For Each d In DataModel BodyContent.Replace(d.Key, d.Value) Next Return BodyContent End Function Protected MustOverride Sub PopulateMailMessage() Protected MustOverride Sub CreateDataModel() End Class 看起来很好。