У меня есть такой фрейм данных,

user_name1     user_name2        user_name3
0                Alex              0
0                  0               0
0                  0             Jacob
0
                  Lee             Mark
John               0              Kevin

Я хочу изменить это таким образом, игнорируя 0 или любые значения NA,

user_name1     user_name2        user_name3
    John          Alex              Jacob
    0             Lee                Mark
    0              0                 Kevin
    0              0                   0
    0              0                   0
    0              0                   0

Примечательно, что номера строк не изменятся.

user_name1 <- c(0,0,0,0, "", "John")
user_name2 <- c("Alex", 0,0, "", "Lee",0)
user_name3 <- c(0,0, "Jacob", "",  "Mark", "Kevin")
df<- data.frame(user_name1, user_name2, user_name3)
r row na
1
Bipul Mohanto 23 Фев 2016 в 18:45

2 ответа

Лучший ответ

Уменьшение sort хорошо работает:

df[] <- lapply(df, sort, decreasing=TRUE)
df
#  user_name1 user_name2 user_name3
#1       John        Lee       Mark
#2          0       Alex      Kevin
#3          0          0      Jacob
#4          0          0          0
#5          0          0          0

обновить

Если в данных есть пробелы значений NA, вы можете сначала исправить их, а затем запустить приведенный выше код:

#Example with NA and blank ""
  user_name1 user_name2 user_name3
1          0       Alex          0
2          0          0          0
3          0          0      Jacob
4          0                  <NA>
5                   Lee       Mark
6       John          0      Kevin

Сначала приведите значения к нулю, затем sort:

df[df=="" | is.na(df)] <- 0
df[] <- lapply(df, sort, decreasing=TRUE)
#  user_name1 user_name2 user_name3
#1       John        Lee       Mark
#2          0       Alex      Kevin
#3          0          0      Jacob
#4          0          0          0
#5          0          0          0
#6          0          0          0

данные

user_name1 <- c(0,0,0,0,"", "John")
user_name2 <- c("Alex", 0,0,"", "Lee",0)
user_name3 <- c(0,0, "Jacob", NA, "Mark", "Kevin")
df<- data.frame(user_name1, user_name2, user_name3,
                      stringsAsFactors=FALSE)
3
akrun 23 Фев 2016 в 16:56

С dplyr

library(dplyr)
df[df=="" | is.na(df)] <- 0
df <- df %>% mutate_each(funs(sort(.,decreasing = TRUE))) 

#      user_name1 user_name2 user_name3
#1       John        Lee       Mark
#2          0       Alex      Kevin
#3          0          0      Jacob
#4          0          0          0
#5          0          0          0
2
Bipul Mohanto 23 Фев 2016 в 17:04