想了解一下dplyr代码,但无法弄清楚这一点.见过这里所描述的许多变量(一个类似的问题,总结因素的计数与dplyr并把值出现次数的计数横行到新的变数,如何做到在R里面有dplyr? ),但我的任务就是略小.
给定一个数据框,如何计算变量的频率并将其放在一个新变量中.
set.seed(9)
df <- data.frame(
group=c(rep(1,5), rep(2,5)),
var1=round(runif(10,1,3),0))
Run Code Online (Sandbox Code Playgroud)
然后我们有:
>df
group var1
1 1 1
2 1 1
3 1 1
4 1 1
5 1 2
6 2 1
7 2 2
8 2 2
9 2 2
10 2 3
Run Code Online (Sandbox Code Playgroud)
想要第三列指示每组(group)var1发生多少次,在这个例子中,这将是:count =(4,4,4,4,1,1,3,3,3,1).我试过 - 没有成功 - 比如:
df %>% group_by(group) %>% rowwise() %>% do(count = nrow(.$var1))
Run Code Online (Sandbox Code Playgroud)
解释非常感谢!
require(plyr)
require(dplyr)
set.seed(8)
df <-
data.frame(
v1 = runif(10, -1,1),
v2 = runif(10, -1,1))
Run Code Online (Sandbox Code Playgroud)
问题:我怎样才能获得正确的值到min()功能的一部分mutate()-基本上,我想分配v3为v1具有最小的划分v1和v2.这不起作用:
df <-
df %>% mutate(v3=ifelse(v1 !=0, v1/min(v1,v2), 0))
Run Code Online (Sandbox Code Playgroud)
我想我错过了一些非常简单的事情.
当我尝试使用ggplot2它来应用自定义主题时会出现如下错误:
Error in FUN("text"[[1L]], ...) :
Theme element 'text' has NULL property: family, face, size, hjust, vjust, angle, lineheight
Run Code Online (Sandbox Code Playgroud)
我想我必须错过一些基本的东西(我第一次尝试创建自定义主题).该主题基于以下内容创建theme_bw():
theme_new <- function(base_size = 12, base_family = "Helvetica"){
theme_bw(base_size = base_size, base_family = base_family) %+replace%
theme(
line = element_line(colour="black"),
text = element_text(colour="black"),
axis.title = element_text(size = 14),
axis.text = element_text(colour="black", size=8),
strip.text = element_text(size=12),
legend.key=element_rect(colour=NA, fill =NA),
panel.grid = element_blank(),
panel.border = element_rect(fill = NA, colour = "black", size=1),
panel.background = element_rect(fill = "white", colour = …Run Code Online (Sandbox Code Playgroud) 我试图使用自定义函数管道mutate语句.我看起来有点类似的SO帖子但是徒劳无功.假设我有一个这样的数据框(其中blob一些变量与特定任务无关,但是是整个数据的一部分):
df <-
data.frame(exclude=c('B','B','D'),
B=c(1,0,0),
C=c(3,4,9),
D=c(1,1,0),
blob=c('fd', 'fs', 'sa'),
stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)
我有一个使用变量名的函数,所以根据exclude列中的值选择一些,例如计算未指定的变量的总和exclude(总是单个字符).
FUN <- function(df){
sum(df[c('B', 'C', 'D')] [!names(df[c('B', 'C', 'D')]) %in% df['exclude']] )
}
Run Code Online (Sandbox Code Playgroud)
当我给出一行(第1行)时,FUN我得到预期的C和D(和那些未提及的exclude),即4:
FUN(df[1,])
Run Code Online (Sandbox Code Playgroud)
如何在具有mutate的管道中进行类似操作(将结果添加到变量中s).这两次尝试不起作用:
df %>% mutate(s=FUN(.))
df %>% group_by(1:n()) %>% mutate(s=FUN(.))
Run Code Online (Sandbox Code Playgroud)
更新 这也不能按预期工作:
df %>% rowwise(.) %>% mutate(s=FUN(.))
Run Code Online (Sandbox Code Playgroud)
这是有原因的,但不在dplyr的mutate(和管道)中:
df$s <- sapply(1:nrow(df), function(x) FUN(df[x,]))
Run Code Online (Sandbox Code Playgroud) 我怎么能在类似问题的函数传递一个列名在这里,但使用dplyr链接和filter()一起%in%.
require(dplyr)
set.seed(8)
df <- data.frame(
A=sample(c(1:3), 10, replace=T),
B=sample(c(1:3), 10, replace=T))
Run Code Online (Sandbox Code Playgroud)
如果想要获得A列为1或2的行,我可以这样做:
df %>% filter(A %in% c(1,2))
Run Code Online (Sandbox Code Playgroud)
我明白了:
A B
1 2 3
2 1 2
3 1 3
4 2 1
5 1 1
6 1 3
Run Code Online (Sandbox Code Playgroud)
现在,我如何将它放在一个函数中,可以指定列,这不起作用:
fun1 <- function(x, column, n){
res <-
x %>% filter(column %in% n)
return(res)
}
fun1(df, A, c(1,2))
Run Code Online (Sandbox Code Playgroud) df <- data.frame(
exp=c(1,1,2,2),
name=c("gene1", "gene2", "gene1", "gene2"),
value=c(1,1,3,-1)
)
Run Code Online (Sandbox Code Playgroud)
在尝试获得定制时dplyr,reshape2我偶然发现了一种基于几种条件选择行的"简单"方法.如果我想在实验1(== 1)name中具有value高于0的那些基因(变量)并且在实验2中exp同时value低于0; 在df中,这将是"gene2".当然必须有很多方法,例如每组条件的子集df(exp == 1&value> 0,exp == 2和value <0),然后加入这些子集的结果:
library(dplyr)
inner_join(filter(df,exp == 1 & value > 0),filter(df,exp == 2 & value < 0), by= c("name"="name"))[[1]]
Run Code Online (Sandbox Code Playgroud)
虽然这个作品看起来非常akward的,我觉得这样的条件筛选在于在的心脏reshape2和dplyr,但无法弄清楚如何做到这一点.有人可以在这里启发我吗?
在过去的几天里,我一直无法推送到远程(gitlab),它在此之前一直有效。我知道这个问题有 10 个类似的问题,也许答案就在其中的某个地方。然而,我一直在尝试许多建议的解决方案 - 但徒劳。
当我推动时,我得到:
ssh: connect to host gitlab.com port 22: Connection refused
fatal: The remote end hung up unexpectedly
本地位于宪法服务器上,这里的许多人都使用端口 22 主要用于 github,没有任何问题。这是否可能是我这边的防火墙设置可能与 gitlab 特别相关?管理员确保这不是简单的白名单问题。
我的 gitlab 网址如下:
origin git@gitlab.com:myname/myproject.git (fetch)
origin git@gitlab.com:myname/myproject.git (push)
我尝试使用替代的 ssh 格式更新 git-url:
origin ssh://git@gitlab.com/myname/myproject.git (fetch)
origin ssh://git@gitlab.com/myname/myproject.git (push)
我已经尝试了端口 22 和替代端口 443 - 这是文件~/.ssh/config:
Host gitlab.com
RSAAuthentication yes
IdentityFile ~/.ssh/id_rsa
选择:
Host gitlab.com
Hostname altssh.gitlab.com
User git
Port 443
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
我尝试过使用 https 连接(徒劳)。
制作了新的 ssh 密钥(徒劳)。 …
我是新手,dplyr无法弄清楚如何控制变量来通过chaining(%>%)命令.简单的例子:该str_sub函数有三个参数 - 第一个是传递%>%但是如何获得最后两个?:
library(stringr)
library(dplyr)
df <- data.frame(V1 = c("ABBEDHH", "DEFGH", "EFGF", "EEFD"),
V2=c(4, 2, 1, 1), V3=c(5, 2, 2, 1), stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
在基地RI可以做:
with(df, str_sub(V1, V2, V3))
Run Code Online (Sandbox Code Playgroud)
得到:
## [1] "ED" "E" "EF" "E"
Run Code Online (Sandbox Code Playgroud)
如何链接这个?- 我试过了:
df %>% str_sub(V1, V2, V3) # Here V3 is unused arg since V1 is treated as 2nd arg
df %>% select(V1) %>% str_sub(V2, V3) # Here V2 and V3 are not recognized
Run Code Online (Sandbox Code Playgroud) df <-
data.frame(a=LETTERS[1:4],
b=rnorm(4)
)
vals <- c("B","D")
Run Code Online (Sandbox Code Playgroud)
我可以df使用以下值过滤/子集val:
dplyr::filter(df, a %in% vals)
subset(df, a %in% vals)
Run Code Online (Sandbox Code Playgroud)
两者都给出:
a b
2 B 0.4481627
4 D 0.2916513
Run Code Online (Sandbox Code Playgroud)
如果我在向量中有变量名称,例如:
> names(df)[1]
[1] "a"
Run Code Online (Sandbox Code Playgroud)
然后它不起作用 - 我猜因为它的引用
dplyr::filter(df, names(df)[1] %in% vals)
[1] a b
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)
你怎么做到这一点 ?
更新(如果它的dplyr :: tbl_df(df))
下面的答案适用于data.frames,但不适用于dplyr :: tbl_df包装数据:
df<-dplyr::tbl_df(df)
dplyr::filter(df, df[,names(df)[1]] %in% vals)
Run Code Online (Sandbox Code Playgroud)
不起作用(我认为tbl_df在df之上是一个简单的包装?)
这确实有效:
dplyr::filter(df, as.data.frame(df)[,names(df)[1]] %in% vals)
Run Code Online (Sandbox Code Playgroud)
最终更新:使用lazyeval :: interp与tbl_df()一起使用
请参阅下面的AndreyAkinshin的解决方案.
我正在尝试对分组 ( dplyr::group_by) 的数据进行滚动意味着 - 我无法理解为什么这不起作用的原因:
set.seed(1)
library(dplyr)
library(zoo)
df <- data.frame(a=sample(LETTERS[1:2], replace= T, 10),
b=rnorm(20), stringsAsFactors = F)
df %>%
group_by(a) %>%
mutate(rollapply(b, 3, mean))
Run Code Online (Sandbox Code Playgroud)
我可以看到这里可以找到一个冗长的解决方案,但想知道为什么上面的方法不起作用