簡體   English   中英

循環遍歷列以在 R 中搜索多個變量

[英]Loop through the columns to search for multiple variables in R

抱歉,這是一個后續問題。 我試圖計算每列中有多少“S”和“T”出現在 1 到 10 行的“下游”,然后是 15 到 25 的“上游”。

ST <- data.frame(scale = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 ), aa = c('A','C','D','E','F','G','H','I','K','L','M', 'N','P','Q','R','S','T','V','W','Y'))

  #input  (example)
   V1  V2  V3  V4  V5 
1  C   D   E    R   N  
2  C   A   M    K   P
3  V   T   Q    Q   E 
4  A   T   S    S   S
5  C   D   E    R   N  
6  C   A   M    K   P
7  V   T   Q    Q   E 
8  A   T   S    S   S
9  R   V   D    S   A
10 W   R   H    I   C
11 S   N   I    P   T
12 Q   A   S    D   E
13 C   D   E    R   N  
14 C   A   M    K   P
15 V   T   Q    Q   E 
16 A   T   S    S   S
17 C   D   E    R   N  
18 C   A   M    K   P
19 V   T   Q    Q   E 
20 A   T   S    S   S
21 R   V   D    S   A
22 W   R   H    I   C
23 S   N   I    P   T
24 G   A   D    S   S 
25 N   T   T    S   A

當我有一個只有“S”的數據框時,下面的腳本可以工作,但是“ST”卻沒有。 有人能告訴我為什么嗎? 當然,我可以分別獲得“S”和“T”,然后稍后再添加,但是有沒有辦法通過這個單一的數據框“ST”來做到這一點?

#sum values from positions 1 to 10 and then from  15 to 25 works well for 1 letter only
count_aa <- df_trial %>%
 summarise(across(everything(), ~ c(sum(.[1:10] == 'T'), sum(.[15:25] == 'T')))) %>%
 mutate(categ = c('upstream', 'downstream'), .before = 1)
#view(count_aa)
df_count_aa<- as.data.frame(t(count_aa))
#view(df_count_aa)

當有多個元素要比較時,我們可以使用%in%而不是==

library(dplyr)
df_trial %>%
   summarise(across(everything(), ~
       c(sum(.[1:10] %in% c('S', 'T')),
         sum(.[15:25] %in% c('S', 'T'))))) %>% 
   mutate(categ = c('upstream', 'downstream'), .before = 1)

-輸出

#        categ V1 V2 V3 V4 V5
#1   upstream  0  4  2  3  2
#2 downstream  1  5  3  5  4

==正在進行元素比較。 如果我們做==與多於一個的元素作為== c("S", "T")那么它的向量元素,導致即“S”的列的整個長度上的回收得到比列的第一個元素,'T' 到第二個元素,'S' 再到第三個元素等等......即比較將基於位置


base R我們可以做colSums

  colSums(df_trial == 'S') + colSums(df_trial == 'T')

在基礎 R 中,您可以執行此sapply

data.frame(categ = c('upstream', 'downstream'), 
           sapply(df_trial, function(x) 
         c(sum(x[1:10] %in% c('S', 'T')), sum(x[15:25] %in% c('S', 'T')))))

#       categ V1 V2 V3 V4 V5
#1   upstream  0  4  2  3  2
#2 downstream  1  5  3  5  4

使用基礎 R

> rbind(downstream = sapply(df[1:10,], function(x) sum(grepl('[ST]',x))),
+      upstream = sapply(df[15:25,], function(x) sum(grepl('[ST]',x))))
           V1 V2 V3 V4 V5
downstream  0  4  2  3  2
upstream    1  5  3  5  4
> 

使用的數據:

> dput(df)
structure(list(V1 = c("C", "C", "V", "A", "C", "C", "V", "A", 
"R", "W", "S", "Q", "C", "C", "V", "A", "C", "C", "V", "A", "R", 
"W", "S", "G", "N"), V2 = c("D", "A", "T", "T", "D", "A", "T", 
"T", "V", "R", "N", "A", "D", "A", "T", "T", "D", "A", "T", "T", 
"V", "R", "N", "A", "T"), V3 = c("E", "M", "Q", "S", "E", "M", 
"Q", "S", "D", "H", "I", "S", "E", "M", "Q", "S", "E", "M", "Q", 
"S", "D", "H", "I", "D", "T"), V4 = c("R", "K", "Q", "S", "R", 
"K", "Q", "S", "S", "I", "P", "D", "R", "K", "Q", "S", "R", "K", 
"Q", "S", "S", "I", "P", "S", "S"), V5 = c("N", "P", "E", "S", 
"N", "P", "E", "S", "A", "C", "T", "E", "N", "P", "E", "S", "N", 
"P", "E", "S", "A", "C", "T", "S", "A")), row.names = c(NA, -25L
), class = c("tbl_df", "tbl", "data.frame"))
> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM