Как отсортировать мои столбцы в кадре данных, чтобы все одинаковые строки в строке находились в одном столбце - PullRequest
2 голосов
/ 28 октября 2019

У меня очень большой фрейм данных из 63 столбцов и 1697 строк. Конец строк заполняется NA, но я хочу, чтобы совпадающие значения в строках находились в одном столбце, и вставляю NA в промежутки

примерно так (обновлено):

v1 <- c("v1","v1","v1","v1","v1","v1","v1")
v2 <- c("v3","v2","v2","NA","v2","v2","v2")
v3 <- c("v4","v4","v3","NA","v3","v3", "v3")
v4 <- c("v5","v5","v4","NA","v5","v4","NA")
v5 <- c("NA","NA","v5","NA","v6","v6", "NA")
v6 <- c("NA","NA","v6","NA","v7","v7","NA")
v7 < - c("NA","NA","NA","NA","NA","NA","NA")
df <- data.frame(v1,v2,v3,v4,v5,v6,v7)

df

  v1 v2 v3 v4 v5 v6 v7
1 v1 v3 v4 v5 NA NA NA
2 v1 v2 v4 v5 NA NA NA
3 v1 v2 v3 v4 v5 v6 NA
4 v1 NA NA NA NA NA NA
5 v1 v2 v3 v5 v6 v7 NA
6 v1 v2 v3 v4 v6 v7 NA
7 v1 v2 v3 NA NA NA NA

но я бы хотел, чтобы все выровнялось следующим образом:

  v1 v2 v3 v4 v5 v6 v7
1 v1 NA NA v4 v5 NA NA
2 v1 v2 NA v4 v5 NA NA
3 v1 v2 v3 v4 v5 v6 NA
4 v1 NA NA NA NA NA NA
5 v1 v2 v3 NA v5 v6 v7 
6 v1 v2 v3 v4 NA v6 v7 
7 v1 v2 v3 NA NA NA NA

Я пробовал map.values ​​(), и это не получилось, как ожидалось, а также ifelse (), но это всетребует, чтобы я ввел конкретные данные ячейки и изменил их.

Имена столбцов совпадают с именами ячеек.

Я хочу использовать данные, чтобы поместить их в график отсутствия присутствия, поэтому я решил, что послеЯ могу просто

for (i in 1:63){
gsub("NA", 0, df[,i]}

и то же самое для всего, что содержит «v», иметь двоичный 1 или 0 для присутствия или отсутствия, но они должны быть выровнены

Нет предопределенных правилУправляя данными, фрейм данных был объединен из многих других файлов .csv, и это лучший формат, в котором я могу получить его в настоящее время.

Буду признателен за любую помощь!

1 Ответ

1 голос
/ 28 октября 2019

Обновлен ответ для соответствия новым входным данным

Данные

Я удалил кавычки из NA:

v1 <- c("v1","v1","v1","v1","v1","v1","v1")
v2 <- c("v3","v2","v2",NA,"v2","v2","v2")
v3 <- c("v4","v4","v3",NA,"v3","v3", "v3")
v4 <- c("v5","v5","v4",NA,"v5","v4",NA)
v5 <- c(NA,NA,"v5",NA,"v6","v6", NA)
v6 <- c(NA,NA,"v6",NA,"v7","v7",NA)
v7 <- c(NA,NA,NA,NA,NA,NA,NA)
df <- data.frame(v1,v2,v3,v4,v5,v6,v7, stringsAsFactors = F)

Код

l <- list()
u <- c("v1", "v2", "v3", "v4", "v5", "v6", "v7")
h <- NULL
for(k in 1:nrow(df)){
  # create a list for each row of the df
  l[[k]] <- df[k, ]
  for(i in 1:length(l[[k]])){
    #check if number exists in the row
    if(u[i] %in% l[[k]]){
      # find the index of the number given it exists
      a <- which(l[[k]] == u[i])
      #assign to "help" vector in order to not overwrite values 
      h[i] <- l[[k]][a]
    }
    else{
      #numbers that do not exist in the vector are asigned NA
      h[i] <- NA
    }
  }
  #replace row by sorted vector with NA place holders ("help" vector)
  l[[k]] <- h
}

Результат

df1 <- as.data.frame(do.call(rbind, l))
df1
  V1 V2 V3 V4 V5 V6 V7
1 v1 NA v3 v4 v5 NA NA
2 v1 v2 NA v4 v5 NA NA
3 v1 v2 v3 v4 v5 v6 NA
4 v1 NA NA NA NA NA NA
5 v1 v2 v3 NA v5 v6 v7
6 v1 v2 v3 v4 NA v6 v7
7 v1 v2 v3 NA NA NA NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...