【发布时间】: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