【问题标题】:ggplot error, filter dplyr error and merging orderggplot错误,过滤dplyr错误和合并顺序
【发布时间】:2017-03-21 00:37:15
【问题描述】:

我有这个数据框:

> str(DFPA)
List of 10
$ Quest  : chr [1:1917] "2" "3" "4" "5" ...
$ PASM   : chr [1:1917] "127.5" "107" "111.5" "103" ...
$ PADM   : chr [1:1917] "85.5" "58.5" "73" "69" ...
$ PAM    : chr [1:1917] "99.5" "74.6666666666667" "85.8333333333333"       "80.3333333333333" ...
$ PP     : chr [1:1917] "42" "48.5" "38.5" "34" ...
$ Idade  : chr [1:1917] "52" "53" "47" "44" ...
$ CCor   : chr [1:1917] "B" "B" "PD" "PD" ...
$ CGI    : chr [1:1917] "3º" "3º" "3º" "3º" ...
$ Sexo   : chr [1:1917] "F" "F" "M" "M" ...
$ FEtária: chr [1:1917] "C" "C" "C" "B" ...

但是,我基于 DFPA 创建了另外 3 个数据框:DFPAA、DFPAB 和 DFPC,它们具有相同的变量,但它们除以年龄、A(25-34 岁)、B(35-44)、C (45-59)。然后,出现这个错误:

library(dplyr)        
 >          DFPAA <- filter(DFPA, FEtária == "A")
 Error in UseMethod("filter_") : 
 no applicable method for 'filter_' applied to an object of class "list"
 >          
 >          DFPAB <- filter(DFPA, FEtária == "B")
 Error in UseMethod("filter_") : 
 no applicable method for 'filter_' applied to an object of class "list"
 >          
 >          DFPAC <- filter(DFPA, FEtária == "C")
 Error in UseMethod("filter_") : 
 no applicable method for 'filter_' applied to an object of class "list"

我已经搜索了这个错误,但答案并没有解决问题。

我遇到的另一个问题是从 SAS 合并另一个数据帧:

install.packages("memisc")

     library(memisc)

     data <- as.data.set(spss.system.file("medicamentos_fase4a_pro_saude.sav"))

     Medicamentos <- subset(data, select = c(quest, med_rec))

     View(Medicamentos)

     library(plyr)

     Med <- ddply(Medicamentos, .(quest), summarize, Rem = paste (med_rec, collapse =", "))

     names(Med)[names(Med) == 'quest'] <- 'Quest'
              DFPA <- merge (DFPA, Med, by = "Quest")

然后,当合并发生时:

 head(DFPA)
 Quest  PASM PADM              PAM   PP Idade CCor CGI Sexo FEtária
 1  1002   102 67.5               79 34.5    58   PD  2º    F       C
 2  1003    99   57               71   42    55   PD  3º    F       C
 3  1005   115   74 87.6666666666667   41    52    B  3º    F       C
 4  1006   152   91 111.333333333333   61    52   PD  2º    F       C
 5  1007 110.5   69 82.8333333333333 41.5    41   PD  3º    F       B
 6  1012   119 74.5 89.3333333333333 44.5    57    P  3º    F       C                                                                                                                                                                                                                                                                

 Rem
 1 ezetimiba+sinvastatina, fitoterápico, nimesulida, quitosana, vitamina
 2     cumarina+troxerrutina, ergotamina+cafeína+dipirona, oxibutinina                                                                                                                                                                                   
 3    dipirona, escopolamina                                                                                                                                                                                                                            
 4        anlodipino, hidroclorotiazida, losartana, não-classificado                                                                                                                                                                                  
 5       desogestrel                                                                                                                                                                                                                                    
 6        anlodipino, atenolol                                                                                                                                                                                                                            

Quest 的升序完全疯狂,我无法组织这个。

然后,当我创建一个包含抗高血压药物的列表以使用此功能从数据框中排除时:

     ListadeMedicamentos <- c("...", ...)
     DFPA2 <- DFPA[ !DFPA$Rem %in% ListaMedicamentosHAS, ]

它排除了一些行,但不排除其他行。不是这个数据框上的每个人都使用药物,所以我预计合并可能会产生一些 NA,但它没有,我认为这是错误的。

我使用ggplot时出现的另一个问题,出现这个错误:error-discrete-value-supplied-to-continuous-scale

这是我正在使用的模型:

GSS <- ggplot(DFPA, aes(x=PASM, fill=Sexo)) + geom_density(alpha=.3)     + scale_x_continuous (name = "Pressão Arterial Sistólica Média", limits = c(86, 230)) + scale_y_continuous(name = "Probabilidade", limits = c(0, 0.06))

所以,我有 3 个问题:过滤函数、列表和 ggplot!

谢谢!

编辑:

DFPA <- as.data.frame(DFPA)

class(DFPA)
data.frame

head(DFPA)
Quest  PASM PADM              PAM   PP Idade CCor CGI Sexo FEtária
1     2 127.5 85.5             99.5   42    52    B  3º    F       C
2     3   107 58.5 74.6666666666667 48.5    53    B  3º    F       C
3     4 111.5   73 85.8333333333333 38.5    47   PD  3º    M       C
4     5   103   69 80.3333333333333   34    44   PD  3º    M       B
5     7 112.5 72.5 85.8333333333333   40    54   PD  3º    F       C
6     8    99 62.5 74.6666666666667 36.5    54    B  2º    M       C

所以,现在我可以合并 2 个数据框,没关系。

但是,我无法创建包含列值的数据子集 (FEtária)

> DFPAC <- DFPA[DFPA$FEtária == "C", ]
Error in DFPA[DFPA$FEtária == "C", ] : incorrect number of dimensions
> DFPAc <- subset(DFPA, FEtária == "C")
> View(DFPAC)
Error in View : arguments imply differing number of rows: 1917, 0
> sel <- apply(DFPA[,FEtária],1,function(row) length(grep("C",row))>0)
Error in DFPA[, FEtária] : incorrect number of dimensions
> 
> class(FEtária)
[1] "factor"
> DFPAC <- subset(DFPA, grepl("C", DFPA$FEtária))
> 
> View(DFPAC)
Error in View : arguments imply differing number of rows: 1917, 0
> DFPAC <- DFPA[grep("C", DFPA$FEtária), ]
Error in DFPA[grep("C", DFPA$FEtária), ] : incorrect number of dimensions
> class(DFPA)
[1] "list"
> DFPA <- as.data.frame(DFPA)
> > DFPAC <- DFPA[grep("C", DFPA$FEtária), ]
Error: unexpected '>' in ">"
> 
> DFPAC <- DFPA[grep("C", DFPA$FEtária), ]
> 
> View(DFPAc)
Error in View : arguments imply differing number of rows: 1917, 0

我不知道如何排除列表中包含相同“值”的行。 grepl() 不起作用:

> Med <- Med[!grepl(ListadeMedicamentosHAS, Med$Rem), ]
Error in Med[!grepl(ListadeMedicamentosHAS, Med$Rem), ] : 
incorrect number of dimensions
In addition: Warning message:
In grepl(ListadeMedicamentosHAS, Med$Rem) :
argument 'pattern' has length > 1 and only the first element will be used

> DFPAC <- filter(DFPA, !grepl("ListadeMedicamentosHAS"))
Error in filter_impl(.data, dots) : 
argument "x" is missing, with no default

我认为我的帖子非常混乱,所以我会尽量简化它:我有 DFPA,然后我需要根据“FEtária”对它进行子集化,它有 3 个值(A、B 和 C)。与此同时,在您的帮助下,我需要从 DFPA 中排除“ListadeMedicamentos”中的所有高血压药物,我现在已经正确合并了!

谢谢你们!

【问题讨论】:

  • 对于第一点,你没有data.frame,它是list
  • 您拥有的数据是list,就像尼克建议的那样。您能否将list 转换为data.frame 并发布您的示例数据。
  • 舒尔,我会编辑的

标签: r ggplot2 merge dplyr


【解决方案1】:

我使用ggplot时出现的另一个问题,出现了这个错误: 误差离散值提供到连续尺度

DFPA$PASM 必须是数字,但现在是字符或因子。如果只是作为文本导入的纯数字,您可以使用as.numeric(DFPA$PASM),但之后请确保数据看起来符合您的预期(即检查范围和分布是否合理)。

Quest 的升序完全疯狂,我无法组织这个。

合并通过对关键变量进行排序来工作。只需在合并后按照您想要的任何顺序对合并的数据框进行排序即可。

然后,当我创建一个包含要排除的抗高血压药物的列表时 来自具有此功能的数据框:

 ListadeMedicamentos <- c("...", ...)
 DFPA2 <- DFPA[ !DFPA$Rem %in% ListaMedicamentosHAS, ]

它排除了一些行,但不排除其他行。

%in% 检查是否有任何元素完全匹配,并且不查看字符串内部。 "a" %in% c("aaa", "a + a", "a ") 将返回 FALSE。如果您想将药物列表保留为串联字符串,请阅读 R 中的 grep

并非此数据框中的每个人都使用药物,所以我预计合并可能会产生一些 NA,但事实并非如此,我认为这是错误的。

merge 默认对应于数据库操作中的INNER JOIN:只维护两个输入数据帧中存在的行。如果您还想保留其他行,请查看?merge 中的all, all.x, all.y 选项。

【讨论】:

  • 感谢您的回答,我可以正确合并,但我无法解决其他 2 个问题:子集和排除包含抗高血压药物的行。
  • 排除行需要循环,因为grepl 一次只查找一个模式。像for(m in listedMeds){ DF = DF[ !grepl(m, DF$Rem), ] } 这样的东西。不过,子集应该有效 - 也许您之前已经覆盖了您的数据框?尝试重新加载 R,如果仍然无法正常工作,请提供 str(DFPA) 的输出,并且只提供 DFPA$Fetária=="C"。 (顺便说一句,避免在数据中使用 á 或 ° 等花哨的符号。)
  • 再次感谢您的回答。我可以解决所有问题,但出现了另一个问题:当我使用 ggplot 时,出现以下错误:删除了 9 行包含非有限值(stat_density)。但是我没有负值,并且我检查了 xlim 并与数据框进行比较并且范围是正确的,但是当我使用 max(PP) 时,会出现一个不在数据框中的值,并且它比其他值更大。
  • &gt; str(DFPA) 'data.frame': 1126 obs. of 11 variables: $ Quest : Factor w/ 1918 levels "10","100","1000",..: 5 6 8 9 10 18 19 20 21 26 ... $ PASM : Factor w/ 177 levels "100","100.5",..: 5 176 31 105 22 59 68 166 26 4 ... $ PADM : Factor w/ 122 levels "100","100.5",..: 59 38 72 106 62 107 76 44 71 56 ... $ PAM : Factor w/ 338 levels "100","100.166666666667",..: 213 165 265 67 236 25 310 167 258 206 ... $ PP : Factor w/ 114 levels "100.5","19","24.5",..: 22 37 35 75 36 28 68 21 31 24 ...
  • $ Idade : Factor w/ 35 levels "25","26","27",..: 34 31 28 28 17 35 35 18 20 27 ... $ CCor : Factor w/ 3 levels "B","P","PD": 3 3 1 3 3 3 1 3 1 1 ... $ CGI : Factor w/ 3 levels "1º","2º","3º": 2 3 3 2 3 3 2 3 3 2 ... $ Sexo : Factor w/ 2 levels "F","M": 1 1 1 1 1 1 2 1 1 1 ... $ FEtária: Factor w/ 3 levels "A","B","C": 3 3 3 3 2 3 3 2 2 3 ... $ Rem : chr "ezetimiba+sinvastatina, fitoterápico, nimesulida, quitosana, vitamina e suplemento mineral, vitamina e suplemento mineral, vita"...
【解决方案2】:

您可以在循环中使用as.integersleep 条件的组合。但是,这并不能保证您的进程每隔一秒就会发生一次,因为某些循环可能需要更长的时间,具体取决于 CPU 分配和其他情况。以下代码几乎可以满足您的要求。您会注意到,有时该过程会跳过两秒钟而不是一秒钟。

i=1
df=NULL
while (i <= 10)
{
   p1 <- proc.time()
   system_time <- Sys.time()
   if (as.integer(system_time)%%2 == 0)
   {
          if(is.null(df))
          {
              df <- system_time
          }else{
              df <- rbind(df, system_time)
          }
         i = i + 1
       }
       Sys.sleep(abs(1- (proc.time() - p1)))
}

输出是:

> df
               [,1]
df          1490062164
system_time 1490062166
system_time 1490062168
system_time 1490062170
system_time 1490062172
system_time 1490062174
system_time 1490062176
system_time 1490062178
system_time 1490062180
system_time 1490062182

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2014-09-24
    • 2019-05-04
    • 2018-11-23
    相关资源
    最近更新 更多