2016-09-13 86 views
0

我創建的數據幀:值可能

df <- mydata %>% 
    mutate(length.class=cut(mydata$count,breaks = c(1, 10, 100, 1000, 10000),include.lowest=TRUE)) %>% 
    group_by(length.class) %>% 
    summarise(count = n()) 

這導致df$length.class有像值「(100,1e + 03]」,而我更喜歡有「(100,1000] 」但是,手動更改它不起作用:

df$length.class[df$length.class == "(100,1e+03]"] <- "(100,1000]" 

Warnmeldung: 
In `[<-.factor`(`*tmp*`, df$length.class == "(100,1e+03]", value = c(1L, : 
    invalid factor level, NA generated 

爲什麼改變串不可能的,什麼嘗試R鍵告訴我這個消息

獎金的問題:我如何能得到原價值迴歸或處理更改的行(4)?執行變更命令後現在有一個「NA」而不是「(100,1e + 03]」

+0

我相信你想改變因素的標籤,而不是數值。您可以在剪切時設置標籤。請看'?cut' – aichao

+0

(注意:我覺得'cut'創建的標籤並不尊重'options(scipen = 5)'。) – r2evans

回答

5

dig.lab論點cut應該照顧這。

從文檔:

整數時,不會給定的標籤,其被使用。它確定格式化中斷號碼時使用的 位數。

在你的情況,你想顯示5位,因此您的代碼將是

mydata %>% 
    mutate(length.class = cut(count, breaks = c(1, 10, 100, 1000, 10000), 
          include.lowest = TRUE, dig.lab = 5)) 

產生的因素樣子的水平:

[1] "[1,10]"  "(10,100]"  "(100,1000]" "(1000,10000]" 
+0

ahhhh,我知道今天我會學到一些新東西,謝謝@aosmith ! – r2evans

+0

完美的作品。感謝@aosmith和所有其他人! – haggis

0
library(dplyr) 
brks <- 10^(0:4) 
# ensure one in each bin 
mydata <- data.frame(count = brks[-1] - diff(brks)/2) 

# create labels to be used in `cut` 
lbls <- mapply(paste0, "(", head(brks, n = -1), ",", brks[-1], "]") 
# fix the first, it's open on the left 
lbls[1] <- paste0("[", brks[1], ",", brks[2], "]") 

df <- mydata %>% 
    mutate(length.class = cut(count, breaks = brks, labels = lbls, 
     include.lowest = TRUE)) %>% 
    group_by(length.class) %>% summarise(count = n()) 
df 
# # A tibble: 4 x 2 
# length.class count 
#   <fctr> <int> 
# 1  [1,10]  1 
# 2  (10,100]  1 
# 3 (100,1000]  1 
# 4 (1000,10000]  1 

如果你不想重新計算,你可以簡單地做:

labels(df$length.count) <- lbls 

(假設每水平/倉的數量正確定義lbls

關於代碼的一些注意事項:

  • 你不需要mydata$mutate之內:你的代碼引用管道外的mydata$count的值,它可以與管道中data.frame的count列的當前值不同。它不在這裏,但它很容易可以,特別是前面的mutategroup_by動詞。
  • 未成年人,但許多人認爲在變量名稱中使用點不僅僅是一個樣式問題:由於R的類繼承的方式,它可能會導致一些不必要的查找(儘管我認爲這是更多的點功能名稱比變量,這也是關於命名約定的一致性)。
1

警告(下面​​)告訴你所有你需要知道的。

Warnmeldung: 
In `[<-.factor`(`*tmp*`, df$length.class == "(100,1e+03]", value = c(1L, : 
    invalid factor level, NA generated 

df$length.classfactor,其值被存儲爲不同levels。您嘗試以不正確的方式替換值。適當的方法是更改​​levels,而不是顯示的值。因子以整數存儲,存儲器中的整數與用於顯示的levels之間的映射。

第一個選項是緊湊的,雖然它是不可讀的。或者你可以總是使用兩行代碼

levels(df$length.class)[ which(levels(df$length.class) == "(100,1e+03]") ] <- "(100,1000]" 

lvl_idx <- which(levels(df$length.class) == "(100,1e+03]") 
levels(df$length.class)[lvl_idx] <- "(100,1000]"