фрейм данных подмножества на основе иерархического предпочтения уровней факторов в столбце R - PullRequest
2 голосов
/ 25 мая 2020

У меня есть фрейм данных, который я хотел бы разбить на подмножество на основе иерархического предпочтения уровней факторов в столбце. В следующем примере я хочу показать, что для каждого уровня «ID» я хочу выбрать только один «метод». В частности, если возможно сохранение CACL, если CACL не существует для этого уровня, тогда подмножество для «KCL», а если таковое не существует, то подмножество для «H2O».

ID<-c(1,1,1,2,2,3)
method<-c("CACL","KCL","H2O","H2O","KCL","H2O")
df1<-data.frame(ID,method)

  ID  method
1  1    CACL
2  1     KCL
3  1     H2O
4  2     H2O
5  2     KCL
6  3     H2O

ID<-c(1,2,3)
method<-c("CACL","KCL","H2O")
df2<-data.frame(ID,method)

  ID  method
1  1    CACL
2  2     KCL
3  3     H2O

Я сделал что-то похожее на подмножество, выбрав минимальное число в пределах уровня, но не могу его адаптировать. Интересно, стоит ли мне использовать здесь ifelse?

#if present, choose rows containing "number" 2 instead of 1 (this column contained only the two numbers 1 and 2)

library(dplyr)
new<-df %>%
group_by(col1,col2,col3) %>%
summarize(number = ifelse(any(number > 1), min(number[number>1]),1))
dfnew<-merge(new,df,by=c("colxyz","number"),all.x=T)

Ответы [ 2 ]

2 голосов
/ 25 мая 2020

Вы можете использовать order с match, а затем просто !duplicated:

df1 <- df1[order(match(df1$method, c("CACL","KCL","H2O"))),]
df1[!duplicated(df1$ID),]
#  ID method
#1  1   CACL
#5  2    KCL
#6  3    H2O

#Variant not changing df1
i <- order(match(df1$method, c("CACL","KCL","H2O")))
df1[i[!duplicated(df1$ID[i])],]
1 голос
/ 25 мая 2020

Вариант с использованием dplyr:

df1 %>% 
  mutate(preference = match(method,  c("CACL","KCL","H2O"))) %>% 
  group_by(ID) %>% 
  filter(preference == min(preference)) %>% 
  select(-preference)

# A tibble: 3 x 2
# Groups:   ID [3]
     ID method
  <dbl> <fct> 
1     1 CACL  
2     2 KCL   
3     3 H2O 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...