gpt4 book ai didi

r - 逐行检查多列的条件

转载 作者:行者123 更新时间:2023-12-04 01:19:03 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to subset all rows in a dataframe that have a particular value

(1 个回答)


去年关闭。




数据示例:

df <- data.frame("a" = c(1,2,3,4), "b" = c(4,3,2,1), "x_ind" = c(1,0,1,1), "y_ind" = c(0,0,1,1), "z_ind" = c(0,1,1,1) )

> df
a b x_ind y_ind z_ind
1 1 4 1 0 0
2 2 3 0 0 1
3 3 2 1 1 1
4 4 1 1 1 1
我想添加一个新列,用于检查以“_ind”结尾的列的整行是否所有值都等于 1。如果是,则返回 1,否则返回 0。因此结果数据帧如下所示:
  a b x_ind y_ind z_ind keep
1 1 4 1 0 0 0
2 2 3 0 0 1 0
3 3 2 1 1 1 1
4 4 1 1 1 1 1
我可以使用 df %>% select(contains("_ind")) 选择列但是我不确定如何进行逐行操作,该操作检查行中的每个值是否都包含 1,然后将该列附加回原始数据帧。
任何帮助将不胜感激!使用 Dplyr 但感谢任何解决方案

最佳答案

您可以使用 rowSums当您的 df 等于 1 时,即

rowSums(df[grepl('_ind', names(df))] == 1) == ncol(df[grepl('_ind', names(df))])
#[1] FALSE FALSE TRUE TRUE
继续您的 dplyr尝试你能做到的,
df %>% 
select(contains("_ind")) %>%
mutate(new = rowSums(. == 1) == ncol(.))

# x_ind y_ind z_ind new
#1 1 0 0 FALSE
#2 0 0 1 FALSE
#3 1 1 1 TRUE
#4 1 1 1 TRUE

#OR you can filter directly

df %>%
select(contains("_ind")) %>%
filter(rowSums(. == 1) == ncol(.))

# x_ind y_ind z_ind
#1 1 1 1
#2 1 1 1
如果您还想保留原始列,则可以使用,
 df %>% 
filter_at(vars(ends_with('_ind')), all_vars(. == 1))

# a b x_ind y_ind z_ind
#1 3 2 1 1 1
#2 4 1 1 1 1
注意:当我们使用 (.) ,点指的是结果数据框。在这种情况下,它指的是条件中指定的列(即以 _ind 结尾的列)

同样在基数 R 中,
df[rowSums(df[grepl('_ind', names(df))] == 1) == ncol(df[grepl('_ind', names(df))]),]
# a b x_ind y_ind z_ind
#3 3 2 1 1 1
#4 4 1 1 1 1

关于r - 逐行检查多列的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62873650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com