r Сохранить имена строк с помощью order () - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу получить вывод, который показывает мой df, отсортированный по количеству NA в каждой строке (как в столбце df_rows_sorted_by_NAs ниже), но при этом сохраняется исходное имя / номер строки (df col). комбинация будет выглядеть как столбец 3 ниже:

# df_rows_sorted_by_NAs    df                  desired_output
# Row   1 :  38            Row  442  :  37     Row  3112 :  38 
# Row   2 :  38            Row  3112 :  38     Row  3113 :  38
# Row   3 :  37            Row  3113 :  38     Row  442  :  37
# Row  18 :  30            Row  1128 :  30     Row  1128 :  30

Я получаю первый вывод с таким:

# Sort df by num of NAs
df_rows_sorted_by_NAs <- df[order(rowSums(is.na(df)), decreasing = TRUE), drop = FALSE, ]

# View obs with >=30 NAs
for (row_name in row.names(df_rows_sorted_by_NAs)) {
  if (rowSums(is.na(df_rows_sorted_by_NAs[row_name,])) >= 30) {
    cat("Row ", row_name, ": ", 
        rowSums(is.na(df_rows_sorted_by_NAs[row_name,])), "\n")
  }
}

Я получаю второй вывод с этим:

for (row_name in row.names(df)) {
  if (rowSums(is.na(df[row_name,])) >= 30) {
    cat("Row ", row_name, ": ", rowSums(is.na(df[row_name,])), "\n")
  }
}

Я пытался drop = FALSE для order, но получил тот же результат.Любые предложения о том, как сохранить имена строк при создании нового df?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Мне кажется, это работает:

a <- c(1, 2, 3)
b<- c(1, NA, 3)
c <- c(NA, NA, 3)
d <- c(1, NA, NA)
e <- c(NA, 2, 3)
df <- data.frame(a, b, c, d, e)
df

df <- df[order(rowSums(is.na(df)), decreasing = TRUE),]
df

дает

  a  b  c  d  e
1 1  1 NA  1 NA
2 2 NA NA NA  2
3 3  3  3 NA  3

, затем

  a  b  c  d  e
2 2 NA NA NA  2
1 1  1 NA  1 NA
3 3  3  3 NA  3

, а затем df [rowSums (is.na (df)))> 1,]

  a  b  c  d  e
2 2 NA NA NA  2
1 1  1 NA  1 NA

Является ли актуальный вопрос, как поставить «Row:» впереди?

paste0("Row ", row.names( df[rowSums(is.na(df)) >1,]), ": ",
               rowSums(is.na(df)))

Дает вам вектор со строками, вы можете печатать его вертикально, но это другой вопрос, чем выполнение сортировки.

0 голосов
/ 01 декабря 2018

Пакет tidyverse подходит для следующих задач:

library(tidyverse)

Пример кадра данных:

df <- tribble(
  ~Length, ~Width, ~Mass, ~Date,
  10.3, 3.1, 0.021, "2018-11-28",
  NA, 3.3, NA, "2018-11-29",
  10.5, NA, 0.025, "2018-11-30"
)

С пакетом dplyr вы можете создать столбец идентификатора и "число NA "столбец с row_number() и rowSums.Конечно, если у вас уже есть столбец идентификатора строки, вы можете удалить ID = row_number() из mutate:

df %>%
  mutate(ID = row_number(), noNAs = rowSums(is.na(.)))

... приводит к ...

# A tibble: 3 x 6
  Length Width   Mass Date          ID noNAs
   <dbl> <dbl>  <dbl> <chr>      <int> <dbl>
1   10.3   3.1  0.021 2018-11-28     1     0
2   NA     3.3 NA     2018-11-29     2     2
3   10.5  NA    0.025 2018-11-30     3     1

..... добавление select по идентификатору и noNAs, упорядочение по noNAs (в порядке убывания):

df <- df %>%
  mutate(ID = row_number(), noNAs = rowSums(is.na(.)))%>%
  select(ID, noNAs) %>%
  arrange(desc(noNAs))

... приводит к ...

# A tibble: 3 x 2
     ID noNAs
  <int> <dbl>
1     2     2
2     3     1
3     1     0

Наконец, если вы хотите отфильтроватьдля рядов с более чем 30 NA, тогда:

df %>% filter(noNAs > 30)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...