Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果满足dplyr筛选器条件,则更新变量_R_Filter_Dplyr_Mutate - Fatal编程技术网

如果满足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()
input
Exclude
。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()
input
Exclude
。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()
input
Exclude
。x不能组合
Startdato
3:Medinsight
。我输入
排除
+任何(是.na(c_横跨(一切())))
。我发现错误发生在第1行。虽然这很好地运行了df%>%filter(is.na(df)[,11:30])Thanx-但当我回答第一个答案时,它对样本有效,但对实际数据无效,我得到以下错误:错误:
mutate()
input
Exclude
。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