如何编写R代码,在一列中循环并处理具有相同值的行(例如名称)?

如何编写R代码,在一列中循环并处理具有相同值的行(例如名称)?,r,R,例如,此表片段: ## AmAcid Codon Number PerThous ## 1 Gly GGG 25874 19.25 ## 2 Gly GGA 13306 9.90 ## 3 Ser UAC 25320 18.84 ## 4 Ser UAU 68310 50.82 ## 5 Val GUC 25874 19.25 ## 6 Val GUA 13306 9.90 ##

例如,此表片段:

##   AmAcid Codon Number PerThous
## 1    Gly   GGG  25874    19.25
## 2    Gly   GGA  13306     9.90
## 3    Ser   UAC  25320    18.84
## 4    Ser   UAU  68310    50.82
## 5    Val   GUC  25874    19.25
## 6    Val   GUA  13306     9.90
## 7    Gly   GGT  25320    18.84
## 8    Gly   GGC  68310    50.82
...

我想编写一个函数/循环,识别所有
AmAcid==Gly
,然后在
Number
和/或
PerThous
列中操作它们各自的值,例如查找max、min、sum等,并对
AmAcid
中的每个其他唯一字符串重复,而不仅仅是
Gly

我有一个非常粗糙的伪代码,但我认为我对R的语法有点偏离了

for (i in AmAcid_tabl$AmAcid) {
  deviation$i <- (max(AmAcid_tabl$Number)-min(AmAcid_tabl$Number))/mean(AmAcid_tabl$Number)
}
for(我在AmAcid\u tabl$AmAcid中){

偏差$i使用
dplyr

library(tidyverse)

dat <- tribble(
  ~AmAcid, ~Codon, ~Number, ~PerThous,
  "Gly",   "GGG",  25874,    19.25,
  "Gly",   "GGA",  13306,     9.90,
  "Ser",   "UAC",  25320,    18.84,
  "Ser",   "UAU",  68310,    50.82,
  "Val",   "GUC",  25874,    19.25,
  "Val",   "GUA",  13306,     9.90,
  "Gly",   "GGT",  25320,    18.84,
  "Gly",   "GGC",  68310,    50.82
)

dat %>% 
  group_by(AmAcid) %>% 
  mutate(i = (max(Number) - min(Number)) / mean(Number)) %>% 
  ungroup()
库(tidyverse)
dat%
组别单位(阿莫西德)%>%
变异(i=(最大(数量)-最小(数量))/平均(数量))%>%
解组()

您可能希望使用
summary()
而不是
mutate()
,具体取决于您想要实现的目标。

使用
dplyr

library(tidyverse)

dat <- tribble(
  ~AmAcid, ~Codon, ~Number, ~PerThous,
  "Gly",   "GGG",  25874,    19.25,
  "Gly",   "GGA",  13306,     9.90,
  "Ser",   "UAC",  25320,    18.84,
  "Ser",   "UAU",  68310,    50.82,
  "Val",   "GUC",  25874,    19.25,
  "Val",   "GUA",  13306,     9.90,
  "Gly",   "GGT",  25320,    18.84,
  "Gly",   "GGC",  68310,    50.82
)

dat %>% 
  group_by(AmAcid) %>% 
  mutate(i = (max(Number) - min(Number)) / mean(Number)) %>% 
  ungroup()
库(tidyverse)
dat%
组别单位(阿莫西德)%>%
变异(i=(最大(数量)-最小(数量))/平均(数量))%>%
解组()

您可能希望使用
summary()
而不是
mutate()
,这取决于您试图实现的目标。

有一些函数可以用来执行此类分组操作

在base R中,您可以执行以下操作:

aggregate(Number~AmAcid, df, function(x) (max(x) - min(x))/mean(x))

#  AmAcid    Number
#1    Gly 1.6566222
#2    Ser 0.9182954
#3    Val 0.6415518
使用
dplyr

library(dplyr)
df %>% 
  group_by(AmAcid) %>% 
  summarise(new_col = (max(Number) - min(Number))/mean(Number))
数据表

library(data.table)
setDT(df)[, .(new_col = (max(Number) - min(Number))/mean(Number)), AmAcid]

有一些函数可用于执行此类分组操作

在base R中,您可以执行以下操作:

aggregate(Number~AmAcid, df, function(x) (max(x) - min(x))/mean(x))

#  AmAcid    Number
#1    Gly 1.6566222
#2    Ser 0.9182954
#3    Val 0.6415518
使用
dplyr

library(dplyr)
df %>% 
  group_by(AmAcid) %>% 
  summarise(new_col = (max(Number) - min(Number))/mean(Number))
数据表

library(data.table)
setDT(df)[, .(new_col = (max(Number) - min(Number))/mean(Number)), AmAcid]

查看
tidyverse
,尤其是
dplyr
包。您可以使用
groupby
mutate
来精确执行此操作。即使没有任何for循环。查看
tidyverse
包,尤其是
dplyr
包。您可以使用
groupby
mutate
来精确执行此操作。Even没有任何for循环。