If-Else语句在R中产生错误的结果
我有一个名为“clean”的数据框,看起来像这样: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/
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