If-Else语句在R中产生错误的结果

If-Else语句在R中产生错误的结果,r,if-statement,decode,R,If Statement,Decode,我有一个名为“clean”的数据框,看起来像这样: structure(list(X = 6:12, CollectorID = c(58302467L, 58302467L, 57754564L, 58301689L, 58302467L, 58302467L, 57754564L), StartDate = structure(c(7L, 6L, 5L, 3L, 4L, 2L, 1L), .Label = c("10/5/14 1:49", "10/5/14 2:03", "10/5/

我有一个名为“clean”的数据框,看起来像这样:

structure(list(X = 6:12, CollectorID = c(58302467L, 58302467L, 
57754564L, 58301689L, 58302467L, 58302467L, 57754564L), StartDate = structure(c(7L, 
6L, 5L, 3L, 4L, 2L, 1L), .Label = c("10/5/14 1:49", "10/5/14 2:03", 
"10/5/14 2:06", "10/5/14 2:09", "10/5/14 2:25", "10/5/14 2:48", 
"10/5/14 3:06"), class = "factor")), .Names = c("X", "CollectorID", 
"StartDate"), class = "data.frame", row.names = c(NA, -7L))
我想将CollectorID中的数值转换为名为“Collector”的新字段中的名称。我正在使用的代码

if(clean$CollectorID==58302467){
  clean$Collector<-"Social Media"
} else if(clean$CollectorID==57754564){
    clean$Collector<-"Email"
} else {
  clean$Collector<-"Blog Post"  
}
我不理解警告,我的代码也产生了错误的结果;它将clean$Collector中的所有值设置为Blog Post。

如果需要,可以使用ifelse。foo是你的数据

foo$Collector <- ifelse(foo$CollectorID == 58302467, "Social Media",
                      ifelse(foo$CollectorID == 57754564, "Email", "Blog Post"))

#   X CollectorID    StartDate    Collector
#1  6    58302467 10/5/14 3:06 Social Media
#2  7    58302467 10/5/14 2:48 Social Media
#3  8    57754564 10/5/14 2:25        Email
#4  9    58301689 10/5/14 2:06    Blog Post
#5 10    58302467 10/5/14 2:09 Social Media
#6 11    58302467 10/5/14 2:03 Social Media
#7 12    57754564 10/5/14 1:49        Email

“匹配”功能也可以在此处使用。以@jazzurro为例:

> ana$type[match(foo$CollectorID, ana$CollectorID)]
[1] "Social Media" "Social Media" "Email"        "Blog Post"    "Social Media" "Social Media" "Email"       
> 
> foo$Collector = ana$type[match(foo$CollectorID, ana$CollectorID)]
> foo
   X CollectorID    StartDate    Collector
1  6    58302467 10/5/14 3:06 Social Media
2  7    58302467 10/5/14 2:48 Social Media
3  8    57754564 10/5/14 2:25        Email
4  9    58301689 10/5/14 2:06    Blog Post
5 10    58302467 10/5/14 2:09 Social Media
6 11    58302467 10/5/14 2:03 Social Media
7 12    57754564 10/5/14 1:49        Email

阅读helpif。一旦你阅读了所有的注释,请参见中的部分,它建议在何处查看ifelse。有了这一点,直接索引就可以了。谢谢@jazzurro,这很好用。想知道如果我有一个更长的值列表要解码,ifelse是否仍然是处理这个问题的最佳方法。如果这是您的数据帧,并且如果您不介意覆盖CollectorID,您可以执行类似于foo[foo==58302467]的操作。例如,如果您的数据有数百万行,则此方法可能不有效。可能您需要在包中使用各种连接函数,如data.table和dplyr。我同意。我不确定这个数据能有多大。
CollectorID <- c(58302467,57754564,58301689)
type <- c("Social Media", "Email", "Blog Post")
ana <- data.frame(CollectorID, type, stringsAsFactors = FALSE)

merge(foo, ana, by = "CollectorID", all = TRUE)

#  CollectorID  X    StartDate         type
#1    57754564  8 10/5/14 2:25        Email
#2    57754564 12 10/5/14 1:49        Email
#3    58301689  9 10/5/14 2:06    Blog Post
#4    58302467  6 10/5/14 3:06 Social Media
#5    58302467  7 10/5/14 2:48 Social Media
#6    58302467 10 10/5/14 2:09 Social Media
#7    58302467 11 10/5/14 2:03 Social Media
> ana$type[match(foo$CollectorID, ana$CollectorID)]
[1] "Social Media" "Social Media" "Email"        "Blog Post"    "Social Media" "Social Media" "Email"       
> 
> foo$Collector = ana$type[match(foo$CollectorID, ana$CollectorID)]
> foo
   X CollectorID    StartDate    Collector
1  6    58302467 10/5/14 3:06 Social Media
2  7    58302467 10/5/14 2:48 Social Media
3  8    57754564 10/5/14 2:25        Email
4  9    58301689 10/5/14 2:06    Blog Post
5 10    58302467 10/5/14 2:09 Social Media
6 11    58302467 10/5/14 2:03 Social Media
7 12    57754564 10/5/14 1:49        Email