小编pip*_*oma的帖子

序列发生时反向计数向量元素

我有值的向量NA,0以及1:

x <- c(NA, 0, 0, 1, 1, 1, 1, NA, 0, 0, 0, 0, NA, NA, 1, 1, 1, NA)
#> x
#[1] NA  0  0  1  1  1  1 NA  0  0  0  0 NA NA  1  1  1 NA
Run Code Online (Sandbox Code Playgroud)

每当序列从切换1到时NA,我想NAs在该事件之前计算非位置并用该数字替换元素.我期待这个输出:

#> x_output
#[1] NA  6  5  4  3  2  1 NA  0  0  0  0 NA NA  3  2  1 NA
Run Code Online (Sandbox Code Playgroud)

有人有解决方案吗?矢量化方法是优选的,因为矢量很长并且数据集相当大.

r vector vectorization sequence

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

dplyr 相当于 sql row_number() over(按值按组顺序分区)

初始情况

我有以下形式的数据集:

library(dplyr)

dat <- tribble(
  ~name, ~iq,
  "ben",  100,
  "alex",  98,
  "mia",  110,
  "paco", 124,
  "mia",  112,
  "mia",  120,
  "paco", 112,
  "ben",   90,
  "alex", 107
)
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列,按降序name对值iq进行排序和分组。在 SQL 中可以写

select
  name,
  iq,
  row_number() over (partition by name order by iq desc) as rank
from
  dat;
Run Code Online (Sandbox Code Playgroud)

这将产生以下预期输出(为简单起见已排序):

library(dplyr)

dat <- tribble(
  ~name, ~iq,
  "ben",  100,
  "alex",  98,
  "mia",  110,
  "paco", 124,
  "mia",  112,
  "mia",  120,
  "paco", 112,
  "ben",   90,
  "alex", 107
)
Run Code Online (Sandbox Code Playgroud)

问题

使用我的数据,可以通过以下方式获得所需的结果:

dat %>% …
Run Code Online (Sandbox Code Playgroud)

r window-functions dplyr

6
推荐指数
0
解决办法
3274
查看次数

R:使用管道%>%和占位符进一步选择子集

我最近发现了管道操作符%>%,它可以使代码更具可读性.这是我的MWE.

library(dplyr)                                          # for the pipe operator
library(lsr)                                            # for the cohensD function

set.seed(4)                                             # make it reproducible
dat <- data.frame(                                      # create data frame
    subj = c(1:6),
    pre  = sample(1:6, replace = TRUE),
    post = sample(1:6, replace = TRUE)
)

dat %>% select(pre, post) %>% sapply(., mean)           # works as expected
Run Code Online (Sandbox Code Playgroud)

但是,在这种特殊情况下,我很难使用管道操作符

dat %>% select(pre, post) %>% cohensD(.$pre, .$post)    # piping returns an error
cohensD(dat$pre, dat$post)                              # classical way works fine
Run Code Online (Sandbox Code Playgroud)

为什么不能使用占位符.$ …

r dplyr magrittr

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

如何将具有不同数据类型的嵌套列表转换为数据框?

我有一个包含不同类型嵌套元素的列表

library(tidyverse)

# list to be transfomed into a dataframe/tibble
mylist <- 
  list(
    lois = list(
      hair = list(color = "orange", form = "flat"),
      sex = "female"
    )
  )

# structure
str(mylist)
#> List of 1
#>  $ lois:List of 2
#>   ..$ hair:List of 2
#>   .. ..$ color: chr "orange"
#>   .. ..$ form : chr "flat"
#>   ..$ sex : chr "female"
Run Code Online (Sandbox Code Playgroud)

目标是将此列表转换为数据框/tibble。所需的输出是

# A tibble: 3 x 4
  name  value_id attribute text  
  <chr> <chr>    <chr>     <chr> …
Run Code Online (Sandbox Code Playgroud)

r tidyr tidyverse

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

R:在删除最小值和最大值后,在选择的列上计算每行中的SD

我想在删除该选择中的最小值和最大值后,计算数据框中每行的标准偏差.这是一个例子:

set.seed(1)
dat <- data.frame(matrix(sample(c(1:100), 10, replace=TRUE), ncol=5))
Run Code Online (Sandbox Code Playgroud)

我设法为每一行计算我感兴趣的列的sd(1:4):

dat <- transform(dat, sd = apply(dat[,1:4], 1, sd))
show(dat)

  X1 X2 X3 X4 X5       sd
1 27 58 21 95 63 33.95463
2 38 91 90 67  7 24.93324
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何排除min(dat[1,1:4])max(dat[1,1:4])计算之前sd().结果应该是这样的:

  X1 X2 X3 X4 X5       sd
1 27 58 21 95 63 21.92031     # notice: sd calculated by hand using 'sd(c(27,58))'
2 38 91 90 67  7 16.26346     # notice: sd calculated by hand using …
Run Code Online (Sandbox Code Playgroud)

r dataframe

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