簡體   English   中英

plyr in r:使用通配符分組或刪除數字並保留分組列中的字符

[英]plyr in r: using wildcard grouping OR removing numbers and preserving characters in grouping column

我正在使用plyr計算r中的均值和標准差。 但是,我的分組變量包含字母和數字的組合,因此我需要在分組變量中使用某種通配符,或者通過從原始分組變量中刪除數字來創建新的分組變量。 例如,使用以下數據幀:

test5 <- structure(list(A = structure(1:6, .Label = c("JCT1", "JCT2", 
"JCT3", "LFR1", "LFR2", "LFR3"), class = "factor"), B = c(4L, 
5L, 3L, 7L, 3L, 6L), C = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("JCT", 
"LFR"), class = "factor")), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, 
-6L))

    A   B   C
1   JCT1    4   JCT
2   JCT2    5   JCT
3   JCT3    3   JCT
4   LFR1    7   LFR
5   LFR2    3   LFR
6   LFR3    6   LFR

我可以使用以下代碼來計算均值和sd:

library(plyr)
ddply(test5,~A,summarise,mean=mean(B),sd=sd(B))

這給出了一個結果

    A   mean    sd
1   JCT1    4   NA
2   JCT2    5   NA
3   JCT3    3   NA
4   LFR1    7   NA
5   LFR2    3   NA
6   LFR3    6   NA

但是,我真的需要組是JCTLFR ,所以需要1)在代碼中使用通配符(因此組基於JCTLFR ,數字是通配符),或2)創建新列像我的原始數據框中的C已刪除A列中的數字。 例如,如果我可以創建這個新列C那么我可以使用代碼

ddply(test5,~C,summarise,mean=mean(B),sd=sd(B))

產生我想要的結果

      C     mean          sd
1   JCT 4.000000    1.000000
2   LFR 5.333333    2.081666

有誰知道一個簡單的方法來做到這一點? 我以為我可以使用ifelse語句以某種方式創建一個新的列C ,但這需要很多代碼,因為我在我的實際數據幀中有許多不同的值。 我希望有一個更快的方法。

謝謝!

你正在尋找這樣的東西嗎?

library(plyr)
test5$A <- gsub('[0-9]+', '', test5$A)

ddply(test5, .(A), summarise, mean=mean(B, na.rm = T), sd = sd(B, na.rm = T))

    A     mean       sd
1 JCT 4.000000 1.000000
2 LFR 5.333333 2.081666

您可以使用regmatchesregexpr來提取字母,然后根據它進行匯總

> ddply(test5,.(letter=regmatches(A,regexpr("[A-Za-z]*",A))),
    summarise,mean=mean(B),sd=sd(B))
  letter     mean       sd
1    JCT 4.000000 1.000000
2    LFR 5.333333 2.081666

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM