小编tmf*_*mnk的帖子

在dplyr中使用group_by()和filter()类似吗?

在样本上data.frame:

df <- data.frame(V1 = c(1, 3, 4, NA, NA, 6, 9, NA, 10),
V2 = seq(1:9))
Run Code Online (Sandbox Code Playgroud)

group_by()以这种方式使用filter()会产生以下结果:

df %>%
  group_by(miss = !is.na(V1)) %>%
  mutate(lag = V1 - lag(V1))

# A tibble: 9 x 4
# Groups:   miss [2]
     V1    V2 miss    lag
  <dbl> <dbl> <lgl> <dbl>
1    1.    1. TRUE    NA 
2    3.    2. TRUE     2.
3    4.    3. TRUE     1.
4   NA     4. FALSE   NA 
5   NA     5. FALSE   NA 
6    6.    6. …
Run Code Online (Sandbox Code Playgroud)

r dplyr

5
推荐指数
1
解决办法
124
查看次数

提高递归采样函数的性能

作为我上一个问题的后续问题,我对提高现有递归采样函数的性能感兴趣。

递归采样是指为给定的暴露 ID 随机选择最多 n 个唯一的未暴露 ID,然后从剩余的未暴露 ID 中随机选择最多 n 个唯一的未暴露 ID 为另一个暴露 ID。如果给定的公开 ID 没有剩余的未公开 ID,则该公开 ID 将被忽略。

原函数如下:

recursive_sample <- function(data, n) {
 
 groups <- unique(data[["exposed"]])
 out <- data.frame(exposed = character(), unexposed = character())
 
 for (group in groups) {
  
  chosen <- data %>%
   filter(exposed == group,
          !unexposed %in% out$unexposed) %>%
   group_by(unexposed) %>%
   slice(1) %>%
   ungroup() %>%
   sample_n(size = min(n, nrow(.))) 
  
  out <- rbind(out, chosen)
  
 }
 
 out
 
}
Run Code Online (Sandbox Code Playgroud)

我能够创建一个更有效的,如下所示:

recursive_sample2 <- function(data, n) {
 
 groups <- unique(data[["exposed"]]) …
Run Code Online (Sandbox Code Playgroud)

performance r sampling dataframe

5
推荐指数
2
解决办法
391
查看次数

使用向量而不是 R 中的正则表达式从字符串中删除多个单词

我想从 R 中的字符串中删除多个单词,但想使用字符向量而不是正则表达式。

例如,如果我有字符串

"hello how are you" 
Run Code Online (Sandbox Code Playgroud)

并想删除

c("hello", "how")
Run Code Online (Sandbox Code Playgroud)

我会回来

" are you"
Run Code Online (Sandbox Code Playgroud)

我可以近距离接触str_remove()来自stringr

"hello how are you" %>% str_remove(c("hello","how"))
[1]  "how are you"   "hello  are you"
Run Code Online (Sandbox Code Playgroud)

但我需要做一些事情来将其分解为一个字符串。是否有一个函数可以一次调用完成所有这些操作?

string r vector stringr

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

比较R中最大值的两列时如何排除一个值

我有两列:A 和 B,每列的值从 1 到 7。我需要获得两列之间的最大值,不包括值 7,我该怎么做?或者在 A 有 7 的情况下,我保留 B 的值,这对我更有用,例如:

A <- c(1,1,1,3,2,4,2,5,6,7)
B <- c(7,3,6,7,4,1,6,7,3,4)
df <- data.frame(A, B)

Expected results: 1,3,6,3,4,4,6,5,6,4 
Run Code Online (Sandbox Code Playgroud)

r max

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

删除/删除每组 R 中的最后/第一行

这是我的数据框:

categ <- c('a','a','a','b','b')
value <- c(1,2,5,4,5)
df <- data.frame(categ, value)
Run Code Online (Sandbox Code Playgroud)

我想按categ列分组并删除每组中的第一个/最后一个元素。理想情况下,我想创建一个列,指示每个组中的第一个/最后一个元素。这是我尝试过的,但没有奏效:

library('plyr')
ddply(df, .(categ), function(x) x[-nrow(x)])
Run Code Online (Sandbox Code Playgroud)

PS 这可能是重复的问题,但我是 R 的新手,R 非常神秘,所以我无法立即移植解决方案。

group-by r

3
推荐指数
2
解决办法
3384
查看次数

如何在R中的数据帧的每一列中过滤NA

我有一个小玩意儿

DF_TEST = tibble('country'=c('a','a','a','a'),
'id'=c(3,3,3,3),
'shop'=c('dmart','dmart','dmart','dmart'),
'beef'=c(23,NA,NA,NA),
'eggs'=c(NA,33,NA,NA),
'fork'=c(NA,NA,10,NA),
'veg'=c(NA,NA,NA,40))
Run Code Online (Sandbox Code Playgroud)

这里的输出为,

  country    id shop   beef  eggs  fork   veg
  <chr>   <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 a           3 dmart    23    NA    NA    NA
2 a           3 dmart    NA    33    NA    NA
3 a           3 dmart    NA    NA    10    NA
4 a           3 dmart    NA    NA    NA    40
Run Code Online (Sandbox Code Playgroud)

我想通过保留一个侧面 NA 来转换这个 tibble 如下

  country    id shop   beef  eggs  fork   veg
  <chr>   <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 a           3 dmart …
Run Code Online (Sandbox Code Playgroud)

r dplyr

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

将数据框中的多列连接/粘贴到一起

我有一个数据框,其中包含多个观察值(数量及其名称经常变化)以及最小值和最大值。例子:

ID O1_min O1_max O2_min O2_max O3_min O3_max
A  1      2      1      2      1      2
B  1      2      1      2      1      2
C  1      2      1      2      1      2
D  1      2      1      2      1      2
Run Code Online (Sandbox Code Playgroud)

我想遍历我的数据框,并为每个观察值转换 _range 列中的所有 _min 和 _max 列。所以它看起来像这样:

ID O1_range O2_range O3_range
A  1:2      1:2      1:2
B  1:2      1:2      1:2
C  1:2      1:2      1:2
D  1:2      1:2      1:2
Run Code Online (Sandbox Code Playgroud)

我正在使用paste()函数,但这并不能解决我的问题,一旦新列可以随时进入数据框,我想要一个更自动的代码。

r concatenation

2
推荐指数
1
解决办法
1462
查看次数

如果每行确切缺少N个值,则用行表示替换缺失值

我有一个数据矩阵,每行有不同数量的缺失值.我想要的是如果每行缺失值的数量是N(假设为1),则用行表示替换缺失值.

我已经为这个问题创建了一个解决方案,但它是一个非常不优雅的解决方案,所以我正在寻找其他的东西.

我的解决方案

#SAMPLE DATA

a <- c(rep(c(1:4, NA), 2))
b <- c(rep(c(1:3, NA, 5), 2))
c <- c(rep(c(1:3, NA, 5), 2))

df <- as.matrix(cbind(a,b,c), ncol = 3, nrow = 10)

#CALCULATING THE NUMBER OF MISSING VALUES PER ROW

miss_row <- rowSums(apply(as.matrix(df), c(1,2), function(x) {
  sum(is.na(x)) +
  sum(x == "", na.rm=TRUE)
}) )

df <- cbind(df, miss_row)

#CALCULATING THE ROW MEANS FOR ROWS WITH 1 MISSING VALUE

row_mean <- ifelse(df[,4] == 1, rowMeans(df[,1:3], na.rm = TRUE), NA)

df <- cbind(df, …
Run Code Online (Sandbox Code Playgroud)

r matrix

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

如何在r中的表格中整齐地呈现两个因子的不同组合的输出?

我有一个包含3列的数据集.前两列具有以下来自实验的输入值,并且是因子:

col1=[5,  5,  7,  5, 12,  7,  9,  9, 12, 12,  9,  7] 
col2=[3.0, 0.5, 1.0, 1.0, 0.5, 0.5, 1.0, 0.5, 1.0, 3.0, 3.0, 3.0]
Run Code Online (Sandbox Code Playgroud)

这些组合的结果中的第三列:

col3=[1.435078, 1.161110, 3.012732, 1.341047, 1.299615, 2.718960, 3.913285, 2.064090, 1.261958, 1.158850, 3.079639, 2.579303]
Run Code Online (Sandbox Code Playgroud)

我想要的是使用表格左侧的单个column2值和表格上方的列1值来显示数据,并且列3的值与两个因子的交集处显示的每个唯一因子组合相关.理想情况下,这看起来像这样:

|     | 5    | 7    | 9    | 12   |
|-----|------|------|------|------|
| 0.5 | 1.16 | 2.72 | 3.91 | 1.30 |
| 1.0 | 1.34 | 3.01 | 2.06 | 1.26 |
| 3.0 | 1.43 | 2.58 | 3.08 …
Run Code Online (Sandbox Code Playgroud)

r

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

ifelse()和if在dplyr mutate()中为时间变量给出不同的结果

假设data.frame如下:

df <- read.table(text = "ID Date Condition
                1 2015/01/01  Yes
                1 2015/01/10  No        
                1 2015/01/15  Yes
                2 2015/02/10  No                                   
                2 2015/03/08  No
                3 2015/01/01  No                                     
                3 2015/04/01  Yes
                3 2015/04/10  No
                3 2015/04/01  Yes
                3 2015/04/10  No", header = TRUE)
Run Code Online (Sandbox Code Playgroud)

我想分别计算每个ID的给定日期和第一个日期之间的天数.现在,对于条件始终为"No"的每个ID,我想在列中分配NA以显示结果.

这是我的代码:

df %>%
  mutate(Date = as.Date(Date, "%Y/%m/%d")) %>%
  group_by(ID) %>%
  mutate(Temp = Date - first(Date),
         Res1 = ifelse(all(Condition == "No"), NA, Temp),
         Res2 = if(all(Condition == "No")) NA else Temp)
Run Code Online (Sandbox Code Playgroud)

结果:

      ID Date       Condition Temp    Res1 Res2  
   <int> …
Run Code Online (Sandbox Code Playgroud)

r dplyr

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

lubridate :: interval对象中身份的评估错误

假设这样的df:

df <- data.frame(id = c(rep(1:5, each = 2)),
time1 = c("2008-10-12", "2008-08-10", "2006-01-09", "2008-03-13", "2008-09-12", "2007-05-30", "2003-09-29","2003-09-29", "2003-04-01", "2003-04-01"),
time2 = c("2009-03-20", "2009-06-15", "2006-02-13", "2008-04-17", "2008-10-17", "2007-07-04", "2004-01-15", "2004-01-15", "2003-07-04", "2003-07-04"))

   id      time1      time2
1   1 2008-10-12 2009-03-20
2   1 2008-08-10 2009-06-15
3   2 2006-01-09 2006-02-13
4   2 2008-03-13 2008-04-17
5   3 2008-09-12 2008-10-17
6   3 2007-05-30 2007-07-04
7   4 2003-09-29 2004-01-15
8   4 2003-09-29 2004-01-15
9   5 2003-04-01 2003-07-04
10  5 2003-04-01 2003-07-04
Run Code Online (Sandbox Code Playgroud)

我尝试做的是,首先lubridate在变量“ time1”和“ time2”之间创建一个间隔。其次,我要按“ …

r lubridate tidyverse

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

Tidyr fill()中的变量/列选择

假设df缺少一些像这样的值:

   ID col_A_1 col_A_2 col_B_1 col_B_2
1   1       1      NA      NA       a
2   1       2      NA       1       b
3   1       3       1       2       c
4   1       4       2       3       d
5   1      NA       3       4       e
6   2      NA       1       5       f
7   2      NA       2       6       g
8   2       1       3       7       h
9   2       2       4       8    <NA>
10  2       3       5      NA    <NA>
Run Code Online (Sandbox Code Playgroud)

我只想使用tidyr fill()包含的列中的缺失值来填充缺失值A

我能够使用以下方法实现它:

library(dplyr)
library(tidyr)

df %>%
 group_by(ID) %>%
 fill(names(.)[grepl("A", …
Run Code Online (Sandbox Code Playgroud)

r tidyr

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

Add a separator between every element of a string

Assume a string vector like this:

x <- c("abc", "abcde", "abcde123")
Run Code Online (Sandbox Code Playgroud)

I want to add a separator (a comma or whatever) between every element of a given string to achieve something like this (here the separator is a comma):

[1] "a,b,c"           "a,b,c,d,e"       "a,b,c,d,e,1,2,3"
Run Code Online (Sandbox Code Playgroud)

I am able to achieve it with:

sapply(strsplit(x, "", fixed = TRUE), function(x) paste(x, collapse = ","))
Run Code Online (Sandbox Code Playgroud)

however, I am curious whether there is a different way to achieve it.

string r

-1
推荐指数
1
解决办法
100
查看次数