Использование tidyverse для зацикливания всех строк и определения (и сохранения) только более высокого значения - PullRequest
0 голосов
/ 12 ноября 2018

Я работаю с людьми из области психологии, и факторный анализ является типичной процедурой в этой области. У меня есть набор данных, подобный следующему:

Original dataset

Я хочу сохранить только самое высокое значение в каждой строке при преобразовании всех других значений в пропущенных случаях

New dataset

Я знаю, что dplyr может легко решить эту проблему, но я не смог найти простой пример кода для этого.

Пожалуйста, проверьте код ниже, чтобы воспроизвести этот вопрос:

library(tidyverse)
set.seed(123)
ds <- data.frame(x1 = runif(10,min = .1,.29),x2 = runif(10,min = .1,.35), x3 = runif(10,min = .1,.38))
ds <- ds %>% mutate_all(funs(round(.,3)))

ds 

Пожалуйста, имейте в виду, что этот вопрос может помочь другим людям с такими же (или похожими) проблемами. Я искал, прежде чем спрашивать, и я нашел только одну близкую тему здесь

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Поскольку это место так благосклонно , я решил ответить на свой вопрос после прочтения ответа @ Lefkios-Paikousis. В реальной жизни при проведении факторного анализа мы имеем положительных результатов, а также отрицательных результатов, и нам необходимо поддерживать самое высокое значение с учетом его знака . Например, -0,4 больше 0,2, и первое значение следует сохранить.

Следующий код, который я создал, чтобы выполнить то, что я хочу. Я надеюсь, что это помогает другим людям с параллельными вопросами.

  library(tidyverse)
  set.seed(123)
  ds <- data.frame(x1 = runif(10,min = 0.1,0.29),x2 = runif(10,min = 0.1,0.35), x3 = runif(10,min = 0.1,.38))
  ds <- ds %>% mutate_all(funs(round(.,3))) #round
  ds <- ds %>% mutate(x1 = x1*-1) #transform into negative



  ds <- ds %>% 
    rowwise() %>% #each row
     mutate(Max.Len = pmax(x1,x2,x3)) %>%  #create a var to the highest value
     mutate(Min.Len = pmin(x1,x2,x3)) %>%  #create a var to the lowests value
     mutate(keep = if_else(abs(Max.Len)>abs(Min.Len),Max.Len,Min.Len)) %>% #create a var to point out the highest value considering the sign
     mutate_all(funs(if_else(. == keep, keep, NA_real_))) %>%  #keep only the highest value mainteining the sign
     select(-c(Max.Len, Min.Len, keep)) #supress other variables

Raw dataset

Transformed dataset

Спасибо

0 голосов
/ 12 ноября 2018

Очень быстрый ответ будет:

Используйте функцию pmax (базовая) для построчного максимума, а затем mutate_all с оператором if_else, чтобы сохранить или установить на пропущенное

ds %>% 
  #find the row-wise maximum and store it as a column temporarily
  mutate (max = pmax(x1,x2,x3)) %>% 
  #loop through all columns and do a check whether the value equals the max
  #If Yes, then leave as is, if not then set to NA
  mutate_all( funs(if_else(. == max,max,NA_real_))) %>% 
  #remove the temporary `max` column
  select(-max)

      x1    x2    x3
1     NA    NA 0.349
2     NA    NA 0.294
3     NA    NA 0.279
4     NA    NA 0.378
5     NA    NA 0.284
6     NA 0.325    NA
7     NA    NA 0.252
8  0.270    NA    NA
9  0.205    NA    NA
10    NA 0.339    NA
...