问题很愚蠢,但我想知道我是否遗漏了一些东西.比方说,有一个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) 给定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) 假设我有以下数据框:
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()尝试以这种方式按位置选择列.
我希望能够获得包含a和f之间所有列的数据框,以及具有1到99之间数字的标签的数据框.这可以一起做select()吗?
我对我试图编写的函数的行为感到困惑.我的例子来自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) 我正在玩一些我在数据框中收集的数据,我希望将函数应用于列的所有元素.通常我会用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)
所以,我可以换我的功能f有try(),并获得结果的列:
> 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() …
我认为这是一个非常基本的问题,但我想看看是否有人能想出更优雅的解决方案.也许是通过避免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) 有没有办法在使用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格式化的输出?
我有一个数据框,结构如下:
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)