背景
这是一个玩具df:
df <- data.frame(ID = c("a","b","c","d","e","f"),
gender = c("f","f","m","f","m","m"),
zip = c(48601,NA,29910,54220,NA,44663),stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
如您所见,我NA在zip列中有几个值。
问题
我正在尝试从中随机采样 2 整行df- 但我希望它们zip是不为空的行。
我试过的
这段代码为我提供了一个基本的(即无条件的)随机样本:
df2 <- df[sample(nrow(df), 2), ]
Run Code Online (Sandbox Code Playgroud)
但是,当然,这只能让我实现目标的一半——很多时候它会返回一个NA值为 in的行zip。此代码尝试添加条件:
df2 <- df[sample(nrow(df$zip != NA), 2), ]
Run Code Online (Sandbox Code Playgroud)
我想我已经接近了,但这会产生错误invalid first argument。
有任何想法吗?
问题:要对 中的处方药使用情况进行一些调查分析R,我需要将同一个人 (ID) 的多行变成一行,表明其中TRUE是否有任何所述行TRUE。
这是数据:
df <- data.frame(ID = c("a","a","a","a","a","a"),
cardiovasc = c(T,T,T,T,T,T),
beta_blockers = c(F,F,F,F,F,F),
antibiotics = c(T,F,F,F,F,F),
stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
这是我希望它的样子:
goal <- data.frame(ID = c("a"),
cardiovasc = c(T),
beta_blockers = c(F),
antibiotics = c(T),
stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
如您所知,即使数据集中df$antibiotics只有 1 个TRUE,我也希望将其计入TRUEID 折叠为一行的时间。
我试过的:
主要是,我一直在尝试处理这篇文章,虽然我觉得我已经接近了,但还是出现了错误。这是我的尝试:
df <- df[, lapply(.SD, paste0, collapse=""), by=ID]
Run Code Online (Sandbox Code Playgroud)
哪个产量unused argument (by = ID)。我在同一篇文章中尝试了另一种方法,但这更麻烦,需要我将数据设为data.table. 我需要将事情保留为data.frame.
有任何想法吗?
总结与问题
我最近在 SO 上问了一个与 Postgres 相关的问题,并得到了几个不同的查询答案,这些查询帮助我得到了我想要的结果。他们都工作了,得到了正确的结果,并且都有非常相似的代码。不过,有一行是不同的:一个答案使用了一个WHERE子句来挑选我要求的东西,而另一个则使用了FILTER (WHERE ...). 这两者有什么区别?
背景细节
出于好奇,我询问的表格是这样的:
+--+---------+-------+
|id|treatment|outcome|
+--+---------+-------+
|a |1 |0 |
|a |1 |1 |
|b |0 |1 |
|c |1 |0 |
|c |0 |1 |
|c |1 |1 |
+--+---------+-------+
Run Code Online (Sandbox Code Playgroud)
我想要看起来像这样的东西:
+-----------------------+-----+
|ever treated |count|
+-----------------------+-----+
|0 |1 |
|1 |3 |
+-----------------------+-----+
Run Code Online (Sandbox Code Playgroud)
我得到了两个有效的答案。这是来自 @ErwinBrandstetter 的第一个:
SELECT ever_treated, sum(outcome_ct) AS count
FROM (
SELECT id,
max(treatment) AS ever_treated,
count(*) FILTER (WHERE outcome = 1) AS …Run Code Online (Sandbox Code Playgroud)