我有一个R分配,我必须在我的矩阵中添加一列。这是关于日期(时区),我使用dplyr
和lubridate
库。
所以我想从下表中根据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
答案 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.town
和Imports 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
看起来很好。