小编log*_*min的帖子

在 R 中,从 df 中采样 n 行,其中某个列具有非 NA 值(有条件地采样)

背景

这是一个玩具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)

如您所见,我NAzip列中有几个值。

问题

我正在尝试从中随机采样 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

有任何想法吗?

random r subset dataframe

12
推荐指数
3
解决办法
267
查看次数

在 R 中,将同一 ID 的多个逻辑行折叠为 1 行

问题:要对 中的处方药使用情况进行一些调查分析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.

有任何想法吗?

r dataframe data.table

4
推荐指数
1
解决办法
74
查看次数

PostgreSQL 中的 WHERE 和 FILTER (WHERE) 有什么区别?

总结与问题

我最近在 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)

sql postgresql where-clause

3
推荐指数
1
解决办法
1710
查看次数

标签 统计

dataframe ×2

r ×2

data.table ×1

postgresql ×1

random ×1

sql ×1

subset ×1

where-clause ×1