小编The*_*dor的帖子

索引R中矩阵的元素

问题很愚蠢,但我想知道我是否遗漏了一些东西.比方说,有一个k包含一些数字的向量

> k
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)

我想将其转换为矩阵

> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    0    6    7    8    9
[3,]    0    0   10   11   12
[4,]    0    0    0   13   14
[5,]    0    0    0    0   15
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是使用某些东西upper.tri(),比如像m[upper.tri(m, diag = TRUE)] <- k,但不会给出上面的矩阵.

有更聪明的解决方案吗?下面是我的解决方案,但我们只是说我并不为此感到骄傲.


rows <- rep(1:5, 5:1)

cols1 <- rle(rows)$lengths


cols <- do.call(c, …
Run Code Online (Sandbox Code Playgroud)

r matrix

14
推荐指数
4
解决办法
459
查看次数

R中向量的子向量之和

给定x长度为k 的向量,我想通过k矩阵获得ak,X其中X[i,j]是k 的总和x[i] + ... + x[j].我现在这样做的方式是

set.seed(1)
x <- rnorm(10)

X <- matrix(0,10,10)
for(i in 1:10) 
  for(j in 1:10)
    X[i,j] <- sum(x[i:j])

#             [,1]       [,2]       [,3]      [,4]        [,5]       [,6]        [,7]      [,8]      [,9]      [,10]
# [1,]  -0.6264538 -0.4428105 -1.2784391 0.3168417  0.64634948 -0.1741189  0.31331014 1.0516348 1.6274162  1.3220278
# [2,]  -0.4428105  0.1836433 -0.6519853 0.9432955  1.27280329  0.4523349  0.93976395 1.6780887 2.2538700  1.9484816
# [3,]  -1.2784391 -0.6519853 -0.8356286 0.7596522  1.08915996  0.2686916  0.75612063 1.4944453 2.0702267  1.7648383
# [4,] …
Run Code Online (Sandbox Code Playgroud)

r

10
推荐指数
3
解决办法
758
查看次数

使用带有数字作为名称的dplyr :: select()选择多个列

假设我有以下数据框:

a <- runif(10)
dd <- as.data.frame(t(a))
names(dd) <- c("ID", "a", "a2", "b", "b2", "f", "XXX", "1", "4", "8")
Run Code Online (Sandbox Code Playgroud)

dplyr,有一个很好的方法来选择多个列.例如,要选择列a和列f之间的列,我可以使用

dd %>% dplyr::select(a:f)
Run Code Online (Sandbox Code Playgroud)

在我的问题中,数据框的最后一部分的列可能会有所不同,但它们的名称总是在1到99之间.但是,我似乎无法做到与上面相同的技巧:

> dd %>% select(1:99)
Error: Position must be between 0 and n
> dd %>% select("1":"99")
Error: Position must be between 0 and n
Run Code Online (Sandbox Code Playgroud)

这是因为使用select()尝试以这种方式按位置选择列.

我希望能够获得包含af之间所有列的数据框,以及具有199之间数字的标签的数据框.这可以一起做select()吗?

r identifier illegal-characters dplyr

7
推荐指数
2
解决办法
2万
查看次数

R - model.frame()和非标准评估

我对我试图编写的函数的行为感到困惑.我的例子来自survival包,但我认为问题比这更普遍.基本上,以下代码

library(survival)
data(bladder)  ## this will load "bladder", "bladder1" and "bladder2"

mod_init <- coxph(Surv(start, stop, event) ~ rx + number, data = bladder2, method = "breslow")
survfit(mod_init)
Run Code Online (Sandbox Code Playgroud)

会产生一个我感兴趣的对象.但是,当我在函数中写入它时,

my_function <- function(formula, data) {
  mod_init <- coxph(formula = formula, data = data, method = "breslow")
  survfit(mod_init)
  }

my_function(Surv(start, stop, event) ~ rx + number, data = bladder2)
Run Code Online (Sandbox Code Playgroud)

该函数将在最后一行返回错误:

 Error in eval(predvars, data, env) : 
  invalid 'envir' argument of type 'closure' 
10 eval(predvars, data, env) 
9 model.frame.default(formula = Surv(start, stop, …
Run Code Online (Sandbox Code Playgroud)

r cox-regression survival-analysis

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

从列/列表中过滤try-error对象(dplyr但也更通用)

我正在玩一些我在数据框中收集的数据,我希望将函数应用于列的所有元素.通常我会用purrr::map()它.但是,如果函数为列的其中一个元素返回错误,有时这将无效:

f <- function(x) {
  if(x==2) stop("I hate 2") else x
}

library(dplyr)
dd <- data.frame(x = c(1:2))
dd2 <- dd %>% 
  mutate(fx = purrr::map(.x = x, .f = ~f(.)))
Error: I hate 2
Run Code Online (Sandbox Code Playgroud)

所以,我可以换我的功能ftry(),并获得结果的列:

> dd2 <- dd %>% 
+   mutate(fx = purrr::map(.x = x, .f = ~try(f(.))))
Error in f(.) : I hate 2
> dd2
  x                         fx
1 1                          1
2 2 Error in f(.) : I hate 2\n
Run Code Online (Sandbox Code Playgroud)

现在我理想地想用过filter() …

r dplyr purrr

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

在R中将(0,1,0,0,1,1,1)转换为(0,0,0,1,0,1,2)

我认为这是一个非常基本的问题,但我想看看是否有人能想出更优雅的解决方案.也许是通过避免for循环.

我想有一个函数,它将1和0的向量作为输入,并返回一个相同长度的向量,它计算相同数字的先前位置.

一种非常不优雅的方式是:

count_me <- function(x) {
  count_vector <- numeric(length(x))
  for(i in 2:length(x)) {
    if(x[i] == x[i-1]) count_vector[i] <- count_vector[i-1] + 1
  }
  count_vector
}
Run Code Online (Sandbox Code Playgroud)

它完全返回我想要的东西:

> (p <- sample(c(0,1), size = 10, replace = TRUE))
 [1] 0 1 0 1 1 0 0 1 1 1
> count_me(p)
 [1] 0 0 0 0 1 0 1 0 1 2
Run Code Online (Sandbox Code Playgroud)

r

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

如何在rmarkdown中显示带有results ='asis'的格式化R输出

有没有办法在使用results ='asis'时在rmarkdown/knitr中显示格式化程序R输出?

一个例子是以下功能:

myfun <- function() {
  cat("hello!\n")
  cat(c("one" = 1, "two" = 2))
}
Run Code Online (Sandbox Code Playgroud)

然后,这个块将cat在新行上打印第二个:

```{r}
myfun()
```
Run Code Online (Sandbox Code Playgroud)

很好的印刷

但这将忽略以下格式myfun:

```{r, results = "asis"}
myfun()
```
Run Code Online (Sandbox Code Playgroud)

非格式化打印

有没有一种保持方式,results='asis'但同时保持myfun格式化的输出?

r knitr r-markdown

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

dplyr长到宽

我有一个数据框,结构如下:

dd <- data.frame(round = c("round1", "round2", "round1", "round2"),
                 var1 = c(22, 11, 22, 11),
                 var2 = c(33, 44, 33, 44),
                 nam = c("foo", "foo", "bar", "bar"),
                 val = runif(4))

   round var1 var2 nam        val
1 round1   22   33 foo 0.32995729
2 round2   11   44 foo 0.89215038
3 round1   22   33 bar 0.09213526
4 round2   11   44 bar 0.82644723
Run Code Online (Sandbox Code Playgroud)

从这个我想获得的数据帧与两条线,一个用于的每个值nam和变量 var1_round1,var1_round2,var2_round1,var2_round2,val_round1,val_round2.我真的想找到一个dplyr解决方案.

  nam var1_round1 var1_round2 var2_round1 …
Run Code Online (Sandbox Code Playgroud)

r reshape2 dplyr

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