简体   繁体   中英

how to select rows from lists in r?

df1 = data.frame(
y1 = c(1, -2, 3),
y2 = c(4, 5, 6),out = c("*", "*", "")
 )

Create another dataframe

  df2 = data.frame(
   y1 = c(7, -3, 9),
   y2 = c(1, 4, 6),out = c("", "*", "")
   )

Create list of data frame using list()

   lis = list(df1, df2)

I want to compare row by row (first row from index [[1]] with first row from index [[2]] and so on

if both rows have * or empty (similar) under out, then select the row with the highest absolute value in y1 (and put under ind the index)

otherwise, take the y1 value of the row with * under out (and put under ind the index)

example of desired output:

 y1 y2 out ind
 1  4   *    1
-3  4   *    2
 9  6        2

May be this helps

library(dplyr)
library(data.table)
bind_rows(lis, .id = 'ind') %>% 
  group_by(rn = rowid(ind)) %>%
  slice(if(n_distinct(out) == 1) which.max(abs(y1)) else match("*", out)) %>% 
  ungroup %>% 
  select(y1, y2, out, ind)

-output

# A tibble: 3 × 4
     y1    y2 out   ind  
  <dbl> <dbl> <chr> <chr>
1     1     4 "*"   1    
2    -3     4 "*"   2    
3     9     6 ""    2    

Or use

library(data.table)
 dt1 <- rbindlist(lis, idcol = "ind")
dt1[dt1[, .I[if(uniqueN(out) == 1) which.max(abs(y1)) else 
      match("*", out)], .(rowid(ind))]$V1]
   ind y1 y2 out
1:   1  1  4   *
2:   2 -3  4   *
3:   2  9  6  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM