создать уникальный фрейм данных записи, где присутствуют несколько записей каждого кандидата - PullRequest
0 голосов
/ 14 октября 2019

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

Я пробовал это для цикла for и if. Теперь хочу оптимизировать код

com_data <- function(X) {
  data_set <- data.frame(table(X$id))
  a <- 3
  n <- 3
  for (i in 1:nrow(data_set)) {
    for (j in 1:nrow(X[1:4])) {
      if (data_set$Var1[i] == X$id[j]) {
        count <- count + 1
        #k <- j
      }
      if (count == 1) {
        for (k in 3:ncol(X))

          data_set[i, n] <- X[j, k]
        n <- n + 1

      } else{
        for (k in 3:ncol(X))

          data_set[i, n] <- X[j, k]
        n <- n + 1

      }
    }
    count = 0
    n <- 3

  }

  return(data_set)
}

1 Ответ

0 голосов
/ 14 октября 2019

Немного запутанно, если предположить, что ваш фрейм данных не состоит из векторов списка. «Var» должен быть идентификатором заявителя:

# Sample data used: 

df <- data.frame(

  Date = as.Date(c("27/9/2019", "28/9/2019", "1/10/2019", "2/10/2019"), "%d/%m/%y"),

  dateTime = as.POSIXct(c("27/9/2019", "28/9/2019", "1/10/2019", "2/10/2019"), "%d/%m/%y %H:M:S"),

  Var = as.factor(c("A", "A", "B", "B")), 

  Value = c(56, 50, 90, 100),

  stringsAsFactors = F
)


# Convert factors & dates to strings: 

convert_descriptors_to_char <- function(df){

  as.data.frame(lapply(df, 
                       function(x){

                         if(is.factor(x) | inherits(x, "Date") | inherits(x, "POSIXct") | inherits(x, "POSIXlt")) { 

                           as.character(trimws(x, which = "both"))

                         } else{ 

                           x

                         }

                       }

  ),

  stringsAsFactors = FALSE) 

}

# Convert data types: 

df <- convert_descriptors_to_char(df)

# Merge the separate lists into one: 

df_aggd <- lapply(df, function(x){

                           if(is.character(x)){

                           aggregate(x~df$Var, df, paste0, collapse = ", ")

                           }else if(is.numeric(x)){

                            aggregate(x~df$Var, df, sum) 

                           }else{

                             x

                           }

                         }

                  )

    # Vector to rename "x" to:

    x_vect_names <- names(sapply(df_aggd, function(x){deparse(substitute(x))}))

    # Iterate through list to rename: 

    for (i in seq_along(df_aggd)){

      colnames(df_aggd[[i]]) <- c("Var", x_vect_names[i])

    }

    # Remove Var df: 

    df_aggd <- df_aggd[names(df_aggd) != "Var"]

    # Merge the separate dataframes into one:

    Reduce(function(x, y){merge(x, y, all = TRUE, by = intersect(colnames(x), colnames(y)))}, df_aggd)
...