我有值的向量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)
有人有解决方案吗?矢量化方法是优选的,因为矢量很长并且数据集相当大.
初始情况
我有以下形式的数据集:
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) 我最近发现了管道操作符%>%,它可以使代码更具可读性.这是我的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)
为什么不能使用占位符.和$ …
我有一个包含不同类型嵌套元素的列表
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) 我想在删除该选择中的最小值和最大值后,计算数据框中每行的标准偏差.这是一个例子:
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)