标签: dplyr

dplyr更改了许多数据类型

更改数据类型我可以使用类似的东西

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中有更优雅(更短)的方式吗?

克里斯托夫

r dataframe dplyr

52
推荐指数
5
解决办法
8万
查看次数

以可读的方式获得不同的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)

但这对我来说有点难以理解.有没有更好的方法来进行这种摘要?

idioms r summarization dplyr

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

将参数传递给dplyr函数

我想使用下面的计算参数化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使用非标准评估而引发错误.应该如何编写这个函数?

r lazy-evaluation dplyr

50
推荐指数
5
解决办法
3万
查看次数

使用%>%替换函数,如colnames()< -

如何使用管道操作符管道替换功能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中链接算术运算符

r dplyr magrittr

50
推荐指数
3
解决办法
3万
查看次数

dplyr中的标准评估:summarise_作为字符串给出的变量

我想在一个内部引用一个未知的列名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)

r dplyr

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

应用group_by并汇总数据,同时保留所有列的信息

我有一个包含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查找子组中的百分比并汇总 ",但没有一个地址是我的问题.

r dplyr

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

mutate_if的正确语法

我想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

这个操作的正确语法是什么?

r na dplyr

48
推荐指数
3
解决办法
4万
查看次数

dplyr:选择包含空格的列名

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?我知道以下方法:

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

但是,如果我正在处理大型数据集,如何在不知道索引数字或类似列名的情况下获得完全匹配?

r dataframe dplyr

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

使用dplyr窗口函数计算百分位数

我有一个有效的解决方案,但我正在寻找一个更清晰,更易读的解决方案,可能会利用一些较新的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等)更干净地完成这项工作?干净利落,我的意思是没有"做"声明.

谢谢

r dplyr tidyr

47
推荐指数
6
解决办法
4万
查看次数

在dplyr mutate_at调用中使用多个列的函数

我想使用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)

r dplyr

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

标签 统计

dplyr ×10

r ×10

dataframe ×2

idioms ×1

lazy-evaluation ×1

magrittr ×1

na ×1

summarization ×1

tidyr ×1