如果满足dplyr筛选器条件,则更新变量
使用命令如果满足dplyr筛选器条件,则更新变量,r,filter,dplyr,mutate,R,Filter,Dplyr,Mutate,使用命令df%>%filter(is.na(df)[,2:4])filter函数子集在一个新的df中,该df在第2、3和4列中有带na的行。我想要的不是一个新的子集df,而是在示例“1”中为实际df中名为“Exclude”的新变量赋值 这个带有mutate的例子并不是我想要的,但很接近: 此外,我需要同样的情况发生在其他过滤器条件 我的例子如下: df <- data.frame(A = 1:6, B = 11:16, C = 21:26, D = 31:36) df[3,2:4] &l
df%>%filter(is.na(df)[,2:4])
filter函数子集在一个新的df中,该df在第2、3和4列中有带na的行。我想要的不是一个新的子集df,而是在示例“1”中为实际df中名为“Exclude”的新变量赋值
这个带有mutate的例子并不是我想要的,但很接近:
此外,我需要同样的情况发生在其他过滤器条件
我的例子如下:
df <- data.frame(A = 1:6, B = 11:16, C = 21:26, D = 31:36)
df[3,2:4] <- NA
df[5,2:4] <- NA
df
> df
A B C D
1 1 11 21 31
2 2 12 22 32
3 3 NA NA NA
4 4 14 24 34
5 5 NA NA NA
6 6 16 26 36
如何使用过滤器子集更新easy有什么好主意吗?解决这个问题的困难方法是生成这个子集,为all创建新变量,然后重新连接,但这不是整齐的代码。这是否有效:
library(dplyr)
df %>% rowwise() %>%
mutate(Exclude = +any(is.na(c_across(everything()))), Exclude = na_if(Exclude, 0))
# A tibble: 6 x 5
# Rowwise:
A B C D Exclude
<int> <int> <int> <int> <int>
1 1 11 21 31 NA
2 2 12 22 32 NA
3 3 NA NA NA 1
4 4 14 24 34 NA
5 5 NA NA NA 1
6 6 16 26 36 NA
库(dplyr)
df%%>%rowwise()%%>%
mutate(Exclude=+any(is.na(c_横跨(everything())),Exclude=na_if(Exclude,0))
#一个tibble:6x5
#顺时针:
A B C D排除
1112131NA
2 12 22 32 NA
3 3 NA NA 1
4 4 14 24 34 NA
5不适用1
616162636NA
这是否有效:
library(dplyr)
df %>% rowwise() %>%
mutate(Exclude = +any(is.na(c_across(everything()))), Exclude = na_if(Exclude, 0))
# A tibble: 6 x 5
# Rowwise:
A B C D Exclude
<int> <int> <int> <int> <int>
1 1 11 21 31 NA
2 2 12 22 32 NA
3 3 NA NA NA 1
4 4 14 24 34 NA
5 5 NA NA NA 1
6 6 16 26 36 NA
库(dplyr)
df%%>%rowwise()%%>%
mutate(Exclude=+any(is.na(c_横跨(everything())),Exclude=na_if(Exclude,0))
#一个tibble:6x5
#顺时针:
A B C D排除
1112131NA
2 12 22 32 NA
3 3 NA NA 1
4 4 14 24 34 NA
5不适用1
616162636NA
使用anyNA
df %>% mutate(Exclude=ifelse(apply(df[2:4], 1, anyNA), 1, NA))
# A B C D Exclude
# 1 1 11 21 31 NA
# 2 2 12 22 32 NA
# 3 3 NA NA NA 1
# 4 4 14 24 34 NA
# 5 5 NA NA NA 1
# 6 6 16 26 36 NA
或者只是
df$Exclude <- ifelse(apply(df[2:4], 1, anyNA), 1, NA)
df$Exclude使用anyNA
df %>% mutate(Exclude=ifelse(apply(df[2:4], 1, anyNA), 1, NA))
# A B C D Exclude
# 1 1 11 21 31 NA
# 2 2 12 22 32 NA
# 3 3 NA NA NA 1
# 4 4 14 24 34 NA
# 5 5 NA NA NA 1
# 6 6 16 26 36 NA
或者只是
df$Exclude <- ifelse(apply(df[2:4], 1, anyNA), 1, NA)
df$Exclude我们可以使用base R
使用矢量化的行和数
df$Exclude <- NA^!rowSums(is.na(df[-1]))
我们可以使用向量化的行和
df$Exclude <- NA^!rowSums(is.na(df[-1]))
另一个单线解决方案:
df$Exclude <- as.numeric(apply(df[2:4], 1, function(x) any(is.na(x))))
df$Exclude另一个单线解决方案:
df$Exclude <- as.numeric(apply(df[2:4], 1, function(x) any(is.na(x))))
df$Exclude使用rowwise
,对所有数字列求和,在ifelse中指定1或NA
df#A tibble:6 x 5
#>#按行:
#>A B C D排除
#>
#>1112131NA
#>2 12 22 32 NA
#>3 3 NA NA 1
#>4 4 14 24 34 NA
#>5不适用1
#>616162636NA
使用行方式
,对所有数字列求和,在ifelse中指定1或NA
df#A tibble:6 x 5
#>#按行:
#>A B C D排除
#>
#>1112131NA
#>2 12 22 32 NA
#>3 3 NA NA 1
#>4 4 14 24 34 NA
#>5不适用1
#>616162636NA
使用示例数据,这对我来说也很好。但是,当应用于包含350条记录和63个变量的工作数据集时,它不工作:错误:mutate()
inputExclude
。x输入Exclude
无法回收到350大小。我输入的Exclude
是ifelse(应用(df[11:30],1,anyNA),1,NA)
。我输入的Exclude
的大小必须是350或1,而不是20。或者使用其他选项,我在集合中得到此错误(x,j=name,value=value):提供的20个项目将分配给“Exclude”列的350个项目。如果您希望“回收”RHS,请使用rep()使代码读者清楚地了解此意图。@EirikS使用示例数据进行读取这对我也很有效。但是,当应用于包含350条记录和63个变量的工作数据集时,它不工作:错误:mutate()
inputExclude
。x输入Exclude
无法回收到350大小。我输入的Exclude
是ifelse(应用(df[11:30],1,anyNA),1,NA)
。我输入的Exclude
的大小必须是350或1,而不是20。或者使用其他选项,我在集合中得到此错误(x,j=name,value=value):提供的20个项目将分配给“Exclude”列的350个项目。如果您希望“回收”RHS,请使用rep()向您的代码读者说明此意图。@EirikS read Thanx-但正如我回答firs Response时所说,它对样本有效,但对实际数据无效,我得到以下错误:错误:mutate()
inputExclude
。x不能组合Startdato
和3:Medinsight
。我输入排除
是+任何(是.na(c_横跨(一切())))
。我发现错误发生在第1行。虽然这很好地运行了df%>%filter(is.na(df)[,11:30])Thanx-但当我回答第一个答案时,它对样本有效,但对实际数据无效,我得到以下错误:错误:mutate()
inputExclude
。x不能组合Startdato
和3:Medinsight
。我输入排除
是+任何(是.na(c_横跨(一切())))
。我注意到错误发生在第1行。当运行df%>%filter(is.na(df)[,11:30])Thanx时,正如我在回答其他答案时所写的那样,这对示例数据有效,但对实际数据无效,其中来自此命令的错误消息给出:集合中的错误(x,j=name,value=value):提供的349个项目将分配给“排除”列的350个项目。如果您希望“回收”RHS,请使用rep()向您的代码读者明确这一意图。@EirikS您是否有数据.table
而不是数据.frame
?Thanx-是的,这解决了问题,这是data.table和data.frame,并使用as.data.frame更正了itThanx——正如我在回答其他答案时所写的,这在样本数据上效果很好,但在实际数据上效果不好,其中来自此命令的错误消息给出:set中的错误(x,j=name,value=value):提供了349个项目,分配给“Exclude”列的350个项目。如果您希望“回收”RHS,请使用rep()向代码读者明确此目的。@EirikS您是否有data.table