繁体   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