【问题标题】:How to specify if condition such that I can apply a function to a subset of my dataframe (that is the if statement)?如何指定 if 条件,以便我可以将函数应用于我的数据框的子集(即 if 语句)?
【发布时间】:2020-01-16 01:18:33
【问题描述】:

我想将一个函数应用于我的数据框的一个子集。将此函数设为来自 {gmodels} 的 CrossTable(),它为您提供两个分类变量的交叉表。不过,我的问题并不是专门针对该功能,理想情况下,相同的解决方案也应该适用于任何其他功能,例如table()

现在,我知道如何对数据帧进行子集化、保存输出并使用它,但是如果我想一步完成所有这些操作呢?

这是我的数据,这是我尝试过的:

mydata <- data.frame(var1=c(rep(1:3,5)),
                     var2=c(5,1,1,4,2,3,5,2,2,5,1,2,4,1,1))

library(gmodels)
CrossTable(mydata$var1, mydata$var2, digits=2, expected=F, prop.r=T, prop.c=F, prop.t=F, format="SPSS") # For the whole dataset

if (mydata$var1>1) CrossTable(mydata$var1, mydata$var2, digits=2, expected=F, prop.r=T, prop.c=F, prop.t=F, format="SPSS") 

if 条件产生警告“条件的长度 > 1 并且仅使用第一个元素”,我认为这是因为由于某种原因 if (condition) statement 不能应用于数据帧中的向量。那是对的吗?在 STATA 中,您可以只输入 if var ==x,这似乎有很大不同。

library(tidyverse)
mydata %>% filter(var>1) %>% CrossTable(mydata$var1, mydata$var2, digits=2, expected=F, prop.r=T, prop.c=F, prop.t=F, format="SPSS") 

这已经是 B 计划了,我真的很想选择 A 计划,但这个 tidyverse 解决方案似乎也不能解决问题,因为 CrossTable() 像许多其他函数(例如 table())一样无法处理整理选择对象。

CrossTable(mydata$var1[mydata$var1>1], mydata$var2, digits=2, expected=F, prop.r=T, prop.c=F, prop.t=F, format="SPSS") 

这是 C 计划,按照这个顺序,这是我最不喜欢的选项。所以这是一件好事,这也不起作用,因为显然它会产生两个不同长度的向量:var1 将比var2 短五个观察值

有没有人有解决方案,甚至可能有多种解决方案?谁能告诉我如何通过 c 制定计划?那太好了!

【问题讨论】:

  • @akrun 恕我直言,但我不认为这与您链接的内容重复。我的问题不仅仅是关于子集,而是更多关于如何将它与同一行代码中的其他函数结合起来,以及是否可以使用 if 语句来实现这一点。
  • 当然,这是真的,但一体机是条件。 ;)
  • @akrun 如果你看一下 Ronak 提出的第二个和第三个选项,那不是真的。
  • 好的,我只检查了第一个选项,因为我有视力问题

标签: r if-statement subset


【解决方案1】:

另一种可能是,

with(mydata[mydata$var1 > 1,], CrossTable(var1, var2, digits=2, expected=F, prop.r=T, prop.c=F, prop.t=F, format="SPSS"))

【讨论】:

    【解决方案2】:

    理想情况下,将数据子集化并在您要使用的函数中使用数据

    mydf <- subset(mydata, var1 > 1)
    CrossTable(mydf$var1, mydf$var2, digits=2, expected=F, prop.r=T, prop.c=F, prop.t=F, format="SPSS")
    

    if 条件不会对它只是检查条件的数据进行子集化。

    如果您不想一次性对数据进行子集化,则可以过滤两个术语中的值

    CrossTable(mydata$var1[mydata$var1 > 1], mydata$var2[mydata$var1 > 1], digits=2, expected=F, prop.r=T, prop.c=F, prop.t=F, format="SPSS")
    

    或者使用dplyr,我们可以这样做

    library(dplyr)
    mydata %>% 
      filter(var1 > 1) %>%
      {CrossTable(.$var1, .$var2, digits=2, expected=F, prop.r=T, prop.c=F, prop.t=F, format="SPSS")}
    

    【讨论】:

    • 好的,谢谢,我知道最好分两步完成。也感谢您修复我的计划 b 和 c。但是你能想出一种方法来使 if 语句也能正常工作吗?或者这是不可能的?为什么我不能让 R 检查某个条件是否为真,然后在此基础上应用该函数?
    • @FabianHabersack if 条件只能检查条件而不是子集数据,子集您可能需要使用其他函数。如果您希望 R 检查条件是否为真,然后应用该函数,您可以使用我的第一个答案,甚至是 Joe 的答案,它将数据集中在一行中。
    猜你喜欢
    • 2019-10-15
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多