在具有四列的大型数据框("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)
这应该是结果: …
我目前正在尝试使用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)
谢谢
考虑这个示例数据:
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)只在定义var1和var2不NA.
因此,类似情况的最常见解决方案是使用ifelse.像这样的东西.
mydf %>%
mutate(var3 = ifelse(
test = is.na(var2),
yes = NA,
no = myfn(var1, var2)))
Run Code Online (Sandbox Code Playgroud)
但是,这并不在我的情况下工作,因为ifelse反正实际上通过全矢量var1和var2,以myfn和而不仅仅是当子向量test是FALSE.而这一切都休息,因为myfn每当接收到一个断裂NA.
那么,这个聪明的dplyr解决方案是什么?(我可以在不使用的情况下考虑许多解决方案dplyr,但我只是对dplyr友好的解决方案感兴趣)
在我看来,它filter …
我正在计算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()).
关于我的代码习惯的两个问题:
使用汇总是否比使用汇总更好dplyr::filter,因为过滤器会物理地丢弃行,所以我必须将结果分配给df.tmp左 - 将其连接回原始df(如下所示)?此外,在汇总计算的每一行上重复的大子集表达式使得代码更难以阅读.我是否应该担心(或不关心)缓存子集化操作的行或逻辑索引,在我可能计算的一般情况下说n = 20个新的汇总变量?
并非所有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)