更改数据类型我可以使用类似的东西
l1 <- c("fac1","fac2","fac3")
l2 <- c("dbl1","dbl2","dbl3")
dat[,l1] <- lapply(dat[,l1], factor)
dat[,l2] <- lapply(dat[,l2], as.numeric)
Run Code Online (Sandbox Code Playgroud)
同 dplyr
dat <- dat %>% mutate(
fac1 = factor(fac1), fac2 = factor(fac2), fac3 = factor(fac3),
dbl1 = as.numeric(dbl1), dbl2 = as.numeric(dbl2), dbl3 = as.numeric(dbl3)
)
Run Code Online (Sandbox Code Playgroud)
在dplyr中有更优雅(更短)的方式吗?
克里斯托夫
我是新用的dplyr,我需要计算一组中的不同值.这是一个表格示例:
data=data.frame(aa=c(1,2,3,4,NA), bb=c('a', 'b', 'a', 'c', 'c'))
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
by_bb<-group_by(data, bb, add = TRUE)
summarise(by_bb, mean(aa, na.rm=TRUE), max(aa), sum(!is.na(aa)), length(aa))
Run Code Online (Sandbox Code Playgroud)
但如果我想要独特元素的数量?
我可以:
> summarise(by_bb,length(unique(unlist(aa))))
bb length(unique(unlist(aa)))
1 a 2
2 b 1
3 c 2
Run Code Online (Sandbox Code Playgroud)
如果我想排除NAs,我会做:
> summarise(by_bb,length(unique(unlist(aa[!is.na(aa)]))))
bb length(unique(unlist(aa[!is.na(aa)])))
1 a 2
2 b 1
3 c 1
Run Code Online (Sandbox Code Playgroud)
但这对我来说有点难以理解.有没有更好的方法来进行这种摘要?
我想使用下面的计算参数化dplyr,找出哪些值Sepal.Length与多个值相关联Sepal.Width:
library(dplyr)
iris %>%
group_by(Sepal.Length) %>%
summarise(n.uniq=n_distinct(Sepal.Width)) %>%
filter(n.uniq > 1)
Run Code Online (Sandbox Code Playgroud)
通常我会写这样的东西:
not.uniq.per.group <- function(data, group.var, uniq.var) {
iris %>%
group_by(group.var) %>%
summarise(n.uniq=n_distinct(uniq.var)) %>%
filter(n.uniq > 1)
}
Run Code Online (Sandbox Code Playgroud)
但是,这种方法会因为dplyr使用非标准评估而引发错误.应该如何编写这个函数?
如何使用管道操作符管道替换功能colnames()<-?
这是我正在尝试做的事情:
library(dplyr)
averages_df <-
group_by(mtcars, cyl) %>%
summarise(mean(disp), mean(hp))
colnames(averages_df) <- c("cyl", "disp_mean", "hp_mean")
averages_df
# Source: local data frame [3 x 3]
#
# cyl disp_mean hp_mean
# 1 4 105.1364 82.63636
# 2 6 183.3143 122.28571
# 3 8 353.1000 209.21429
Run Code Online (Sandbox Code Playgroud)
但理想情况下它会是这样的:
averages_df <-
group_by(mtcars, cyl) %>%
summarise(mean(disp), mean(hp)) %>%
add_colnames(c("cyl", "disp_mean", "hp_mean"))
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有每次编写专业功能的情况下这样做?
这里的答案是一个开始,但不完全是我的问题:在dplyr中链接算术运算符
我想在一个内部引用一个未知的列名summarise.dplyr 0.3允许使用变量引用列名称中引入的标准评估函数,但是当您base在例如a中调用R函数时,这似乎不起作用summarise.
library(dplyr)
key <- "v3"
val <- "v2"
drp <- "v1"
df <- data_frame(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))
Run Code Online (Sandbox Code Playgroud)
df看起来像这样:
> df
Source: local data frame [5 x 3]
v1 v2 v3
1 1 6 A
2 2 7 A
3 3 8 A
4 4 9 B
5 5 10 B
Run Code Online (Sandbox Code Playgroud)
我想放弃v1,按v3分组,并为每个组加上v2:
df %>% select(-matches(drp)) %>% group_by_(key) %>% summarise_(sum(val, na.rm = TRUE))
Error in …Run Code Online (Sandbox Code Playgroud) 我有一个包含22000行和25列的大型数据集.我正在尝试基于其中一列对我的数据集进行分组,并根据分组的数据集获取另一列的最小值.但是,问题是它只给了我两列包含分组列和列具有最小值...但我需要与具有最小值的行相关的其他列的所有信息.这是一个简单的例子,只是为了使它可以重现:
data<- data.frame(a=1:10, b=c("a","a","a","b","b","c","c","d","d","d"), c=c(1.2, 2.2, 2.4, 1.7, 2.7, 3.1, 3.2, 4.2, 3.3, 2.2), d= c("small", "med", "larg", "larg", "larg", "med", "small", "small", "small", "med"))
d<- data %>%
group_by(b) %>%
summarise(min_values= min(c))
d
b min_values
1 a 1.2
2 b 1.7
3 c 3.1
4 d 2.2
Run Code Online (Sandbox Code Playgroud)
所以,我还需要有关于列a和d的信息,但是,因为我在列c中的值中有重复,所以我无法根据min_value列合并它们...我想知道是否有任何方法可以保留我们使用dplyr包时其他列的信息.
我在这里找到了一些解释" dplyr:group_by,subset and summarize ",这里" 使用group_by查找子组中的百分比并汇总 ",但没有一个地址是我的问题.
我想NA通过mutate_ifin 用零替换值dplyr.语法如下:
set.seed(1)
mtcars[sample(1:dim(mtcars)[1], 5),
sample(1:dim(mtcars)[2], 5)] <- NA
require(dplyr)
mtcars %>%
mutate_if(is.na,0)
mtcars %>%
mutate_if(is.na, funs(. = 0))
Run Code Online (Sandbox Code Playgroud)
返回错误:
错误
vapply(tbl, p, logical(1), ...):值必须为长度1,但FUN(X[[1]])结果为长度32
这个操作的正确语法是什么?
df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b"
), row.names = c(NA, -3L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
和数据看起来像
a a a b
1 1 2
2 2 3
3 3 4
Run Code Online (Sandbox Code Playgroud)
跟随电话选择
select(df, 'a a')
Run Code Online (Sandbox Code Playgroud)
给
Error in abs(ind[ind < 0]) :
non-numeric argument to mathematical function
Run Code Online (Sandbox Code Playgroud)
如何选择"a a"和/或将其重命名为无空间使用select?我知道以下方法:
names(df)[1] <- "a"select(df, a=1)select(df, ends_with("a"))但是,如果我正在处理大型数据集,如何在不知道索引数字或类似列名的情况下获得完全匹配?
我有一个有效的解决方案,但我正在寻找一个更清晰,更易读的解决方案,可能会利用一些较新的dplyr窗口函数.
使用mtcars数据集,如果我想查看第25,第50,第75百分位数以及每加仑英里数("mpg")和气缸数("cyl"),我使用以下代码:
library(dplyr)
library(tidyr)
# load data
data("mtcars")
# Percentiles used in calculation
p <- c(.25,.5,.75)
# old dplyr solution
mtcars %>% group_by(cyl) %>%
do(data.frame(p=p, stats=quantile(.$mpg, probs=p),
n = length(.$mpg), avg = mean(.$mpg))) %>%
spread(p, stats) %>%
select(1, 4:6, 3, 2)
# note: the select and spread statements are just to get the data into
# the format in which I'd like to see it, but are not critical
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使用dplyr使用一些汇总函数(n_tiles,percent_rank等)更干净地完成这项工作?干净利落,我的意思是没有"做"声明.
谢谢
我想使用dplyr mutate_at函数将函数应用于数据框中的多个列,其中函数输入直接应用的列以及数据帧中的另一列.
作为一个具体的例子,我想改变以下数据帧
# Example input dataframe
df <- data.frame(
x = c(TRUE, TRUE, FALSE),
y = c("Hello", "Hola", "Ciao"),
z = c("World", "ao", "HaOlam")
)
Run Code Online (Sandbox Code Playgroud)
与mutate_at调用类似于此
df %>%
mutate_at(.vars = vars(y, z),
.funs = ifelse(x, ., NA))
Run Code Online (Sandbox Code Playgroud)
返回一个看起来像这样的数据框
# Desired output dataframe
df2 <- data.frame(x = c(TRUE, TRUE, FALSE),
y_1 = c("Hello", "Hola", NA),
z_1 = c("World", "ao", NA))
Run Code Online (Sandbox Code Playgroud)
所需的mutate_at呼叫类似于以下呼叫mutate:
df %>%
mutate(y_1 = ifelse(x, y, NA),
z_1 = ifelse(x, z, NA)) …Run Code Online (Sandbox Code Playgroud)