r - 确定一个值是否在一行列中出现一次,但第二个值根本不出现

标签 r sapply

可能是一个糟糕的标题,但我有一个存储为“1”、“2”和“3”的限定词表。我想要做的是查看每一行(大约 300,000 行,但可变。)并确定单个“3”出现的位置,(如果它出现不止一次,我对它不感兴趣)和其余的该行中的列中有一个“1”,并将其返回到列表中。 (列数和列名根据输入文件而变化。)

本能地,我想通过执行嵌套的 for 循环来尝试这一点,该循环索引行数,然后是列数,然后是一些查找“3”而不是“2”的函数。 --这可能意味着首选方式是某些应用功能正确吗?

另一种方法是对列数求和,加 2,然后对行求和,同时有一个限定符,即行中不能有 2。但这看起来相当复杂。

df1
  seq                        loc   Ball   Cat   Square   Water
1 AAAAAACCAGTCCCAGTTCGGATTG  t       3     1      1       1  
2 AAAAAACCAGTCTCAGTTCGGATTG  b       1     1      3       3
3 AAAAAACCAGTCTCAGTTCGGATTG  t       1     3      2       1
4 AAAAAACCGGTCACAGTTCAGATTG  b       1     1      1       2
5 AAAAAACCGGTCACAGTTCAGATTG  t       1     1      3       1


Expected Ouput:
  seq                        loc     Group   
1 AAAAAACCAGTCCCAGTTCGGATTG  t       Ball    
2 AAAAAACCGGTCACAGTTCAGATTG  t       Square 


dput of df1:
structure(list(seq = structure(c(1L, 2L, 2L, 3L, 3L), .Label = 
c("AAAAAACCAGTCCCAGTTCGGATTG", 
"AAAAAACCAGTCTCAGTTCGGATTG", "AAAAAACCGGTCACAGTTCAGATTG"), class = 
"factor"), 
loc = structure(c(2L, 1L, 2L, 1L, 2L), .Label = c("b", 
"t"), class = "factor"), Ball = c("3", "1", "1", "1", "1"
), Cat = c("1", "1", "3", "1", "1"), Square = c("1", "3", 
"2", "1", "3"), Water = c("1", "3", "1", "2", "1")), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame"))

最佳答案

这是一个没有 tidyverse 甚至 *apply 函数的解决方案。首先,让我们将这四列转换为整数:

cols <- 3:6
df1[cols] <- lapply(df1[cols], as.integer)

然后
df <- df1[rowSums(df1[cols]) == (3 + length(cols) - 1) & rowSums(df1[cols] == 3) == 1, ]
df$Group <- names(df)[cols][which(t(df[cols]) == 3, arr.ind = TRUE)[, 1]]
df
# A tibble: 2 x 7
#   seq                       loc    Ball   Cat Square Water Group 
#   <fct>                     <fct> <int> <int>  <int> <int> <chr> 
# 1 AAAAAACCAGTCCCAGTTCGGATTG t         3     1      1     1 Ball  
# 2 AAAAAACCGGTCACAGTTCAGATTG t         1     1      3     1 Square

在第一行中,我使用两个条件选择了正确的行:在那些 cols 列 ( rowSums(df1[cols] == 3) == 1 ) 中必须只有一个等于 3 的元素,并且该行的总和必须是 3 + length(cols) - 1 。然后在第二行我检查哪些列有 3 并选择 df 的相应名称作为 Group 的值。

关于r - 确定一个值是否在一行列中出现一次,但第二个值根本不出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53841449/

相关文章:

r - 使用 NA 按类别将平均列添加到数据框

r - 在矩阵列表上简化应用、应用表达式

r - 在 R 中使用 sapply 绘制并排图

r - 在 R 中,如何拆分向量中的每个字符串以返回第 N 个字符实例之前的所有内容?

r - 将函数应用于矩阵或数据框的每一行

R从两列创建一个序列表

r - 使用具有 3 个或更多类变量的 KSVM(kernlab)在 R 中创建二维图

r - 从数百万个 GPS 坐标中确定国家的最快方法 [R]

r - 如何将集合运算表达式编程为函数的参数?