相关疑难解决方法(0)

将mutate与条件值组合使用

在具有四列的大型数据框("myfile")中,我必须添加第五列,其中值基于前四列.最近我成为了dplyr的忠实粉丝,主要是因为它在大型数据集中的速度.所以我想知道我是否可以使用mutate函数处理我的问题.

我的数据帧(实际上是它的较短版本)看起来有点像这样:

  V1 V2 V3 V4
1  1  2  3  5
2  2  4  4  1
3  1  4  1  1
4  4  5  1  3
5  5  5  5  4
...
Run Code Online (Sandbox Code Playgroud)

第五列(V5)的值基于一些条件规则:

if (V1==1 & V2!=4) {
  V5 <- 1
} else if (V2==4 & V3!=1) {
  V5 <- 2
} else {
  V5 <- 0
}
Run Code Online (Sandbox Code Playgroud)

现在我想使用mutate函数在所有行上使用这些规则(所以我不必使用慢循环).像这样的东西(是的,我知道它不会这样工作!):

myfile <- mutate(myfile, if (V1==1 & V2!=4){V5 = 1}
    else if (V2==4 & V3!=1){V5 = 2}
    else {V5 = 0})
Run Code Online (Sandbox Code Playgroud)

这应该是结果: …

r dplyr mutate

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

如何使用dplyr更新值

我目前正在尝试使用dplyr更新data.frame中的值但我不知道是否可以替换值的子集?

# the net4 table
head(net4)
Source: local data frame [6 x 4]

  temps2 NNET NET ave
1     18    2   4  36
2     18    2   4  36
3     22    2   4  44
4     18    2   4  36
5     22    2   4  44
6     27    3   4  36

# I would like to do the same command line as below:
subs <- (net4$ave < 10 & net4$ave!=net4$temps2)
net4$ave[subs] <- with(net4[subs,], temps2/NNET*NET)
Run Code Online (Sandbox Code Playgroud)

谢谢

r dplyr

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

使用`dplyr`创建仅为数据子集定义的新变量

考虑这个示例数据:

set.seed(1234567)
mydf <- data.frame(var1 = runif(10), var2 = c(runif(5), rep(NA, 5)))
Run Code Online (Sandbox Code Playgroud)

这个示例矢量化函数,不幸的是,只要其中一个参数发生错误就会触发错误 NA

myfn <- function(x, y){
    sum(x:y)
}
myfn <- Vectorize(myfn)
Run Code Online (Sandbox Code Playgroud)

现在,在dplyr链的中间我需要使用创建一个新变量myfn.这个新变种(var3)只在定义var1var2NA.

因此,类似情况的最常见解决方案是使用ifelse.像这样的东西.

mydf %>%
    mutate(var3 = ifelse(
        test = is.na(var2), 
        yes = NA, 
        no = myfn(var1, var2)))
Run Code Online (Sandbox Code Playgroud)

但是,这并不在我的情况下工作,因为ifelse反正实际上通过全矢量var1var2,以myfn和而不仅仅是当子向量testFALSE.而这一切都休息,因为myfn每当接收到一个断裂NA.

那么,这个聪明的dplyr解决方案是什么?(我可以在不使用的情况下考虑许多解决方案dplyr,但我只是对dplyr友好的解决方案感兴趣)

在我看来,它filter …

r dplyr

8
推荐指数
2
解决办法
793
查看次数

dplyr idiom for summarize()一个filtered-group-by,并且还替换因缺少行而导致的任何NAs

我正在计算dplyr::summarize销售数据的数据框.我做了一个分组(S,D,Y),然后在每个组内,计算中位数和平均值5..43,然后将它们合并回父df.变量X是销售额.X永远不是NA(即df中没有任何明确的NA),但是如果S,D,Y和周数没有数据(如,没有销售),那么就不会有这些值的行在df中(接受它意味着该特定参数集的零销售额).换句话说,在任何结构缺失的行中插入X = 0(但我希望我不需要melt/cast原始的df,以避免膨胀.类似于cast(fill....,add.missing=T)caret::preProcess()).

关于我的代码习惯的两个问题:

  1. 使用汇总是否比使用汇总更好dplyr::filter,因为过滤器会物理地丢弃行,所以我必须将结果分配给df.tmp左 - 将其连接回原始df(如下所示)?此外,在汇总计算的每一行上重复的大子集表达式使得代码更难以阅读.我是否应该担心(或不关心)缓存子集化操作的行或逻辑索引,在我可能计算的一般情况下说n = 20个新的汇总变量?

  2. 并非所有S,D,Y组和过滤器的组合(对于那些周)都有行,那么如何在任何缺失的行上进行汇总以替换NA?目前我做如下.

很抱歉,代码和数据集都是专有的,但这里是代码习惯用法,下面是您应首先运行以生成样本数据的代码:

# Compute median, mean of X across wks 5..43, for that set of S,D,Y-values
# Issue a) filter() or repeatedly use subset() within each calculation?
df.tmp <- df %.% group_by(S,D,Y) %.% filter(Week>=5 & Week<=43) %.%
  summarize(ysd_med543_X  = median(X),
            ysd_mean543_X = mean(X)
           ) %.% ungroup()

# Issue b) how to replace NAs in groups where the group_by-and-filter gave …
Run Code Online (Sandbox Code Playgroud)

idioms r summarization na dplyr

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

标签 统计

dplyr ×4

r ×4

idioms ×1

mutate ×1

na ×1

summarization ×1