2015-04-05 35 views
0

只需使用ddplyr {} plyr和我遇到了以下問題開始:與ddplyr意外變爲R

我創建了一個簡單的數據幀:

require(plyr) 
df <- data.frame(day=c('monday', 'tuesday'), week=c(47,48)) 

現在,當我運行此:

ddply(df, .(day), transform, 
    b = ifelse(week==47, week, day) 
) 

我得到這個:

 day week b 
1 monday 47 47 
2 tuesday 48 2 

而我試圖讓這個:

 day week  b 
1 monday 47  47 
2 tuesday 48 tuesday 

我認爲問題的一部分是,我在一列混合數字和字符串變量。任何想法我怎麼能得到我的預期結果?謝謝!

+2

如果您將日和星期都視爲字符,則會得到預期結果。至少我用我的Mac獲得了預期的結果。 – jazzurro 2015-04-05 04:30:12

+0

嘗試添加'stringsAsFactors = FALSE'到你對'data.frame'的調用中 – 2015-04-05 04:42:01

+2

這給了我在linux mint'ddply(df,。(day),transform,b = ifelse(week == 47,as .character(week),as.character(day)))'as @jazzurro在評論中提到。 – akrun 2015-04-05 04:52:16

回答

1

我很驚訝你沒有設置stringsAsFactors=FALSE得到預期的結果......這是我得到:

require(plyr) 

df1 <- data.frame(day=c('monday', 'tuesday'), week=c(47,48), stringsAsFactors = TRUE) 
df2 <- data.frame(day=c('monday', 'tuesday'), week=c(47,48), stringsAsFactors = FALSE) 


ddply(df1, .(day), transform, 
    b = ifelse(week==47, week, day) 
) 

#  day week b 
# 1 monday 47 47 
# 2 tuesday 48 2 


ddply(df2, .(day), transform, 
    b = ifelse(week==47, week, day) 
) 

#  day week  b 
# 1 monday 47  47 
# 2 tuesday 48 tuesday 

你會得到同樣的,如果你在DF1這種方式轉換的因素:

df1$day <- as.character(df1$day) 
ddply(df1, .(day), transform, 
    b = ifelse(week==47, week, day) 
) 
#  day week  b 
# 1 monday 47  47 
# 2 tuesday 48 tuesday 
+0

謝謝 - 這很有趣,因爲我運行確切的代碼。 當我DF2 ddply運行我得到: '#天工作周b #1星期一47 47 #2日48 1' 我得到完全相同的結果,當我轉換因子DF1了。我正在使用{plyr} v 1.8.1和Mac OS 10.9.5 – Rez99 2015-04-05 05:51:07

+0

嗯,當你打印'df2'時,你會看到任何意想不到的事情嗎? (順便說一句,我使用R 3.1.2,plyr 1.8.1) – 2015-04-05 05:55:07

+0

@akrun其實我只是在編輯前做過我以前的評論! – 2015-04-05 05:58:42