Добавьте столбцы в порядке, учитывая их имена data.frame R - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть data.frame в R, столбцы которого названы L1, L2, L3 и т. Д., Но на данной итерации мне случайным образом передается data.frame со столбцами, как показано ниже.

L1,L3,L5
0.0000000,0.7142857,0.2857143
0.1052632,0.8947368,0.0000000
1.0000000,0.0000000,0.0000000
0.0000000,1.0000000,0.0000000
0.0000000,0.0000000,1.0000000
1.0000000,0.0000000,0.0000000

Мне нужно создать файл с тем же количеством столбцов и номером с порядком имен столбцов, как показано ниже. Добавленные столбцы L2, L4 и L6 должны быть заполнены 0.

L1,L2,L3,L4,L5,L6
0.0000000,0.0,0.7142857,0.0,0.2857143,0.0
0.1052632,0.0,0.8947368,0.0,0.0000000,0.0
1.0000000,0.0,0.0000000,0.0,0.0000000,0.0
0.0000000,0.0,1.0000000,0.0,0.0000000,0.0 
0.0000000,0.0,0.0000000,0.0,1.0000000,0.0
1.0000000,0.0,0.0000000,0.0,0.0000000,0.0

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

с основанием R:

# create example data
df <- read.csv(header=T,
        text = "L1,L3,L5
                0.0000000,0.7142857,0.2857143
                0.1052632,0.8947368,0.0000000
                1.0000000,0.0000000,0.0000000
                0.0000000,1.0000000,0.0000000
                0.0000000,0.0000000,1.0000000
                1.0000000,0.0000000,0.0000000")

# create empty dataframe of zeros, with colnames L1:L6
df0 <- as.data.frame(matrix(0, nrow=nrow(df), ncol=6))
names(df0) <- paste0("L", 1:6)

# cbind df with zero cols from df0
df_result <- cbind(df, df0[ , -match(names(df), names(df0))])

# reorder columns L1:L6
df_result <- df_result[ , sort(names(df_result))]

Обратите внимание, что это эффективный, но неэффективный код, поскольку он создает объект, полный нулей. Это должно хорошо работать с небольшими и средними наборами данных, но я бы порекомендовал что-то более умное для больших наборов данных.

0 голосов
/ 01 сентября 2018

Обзор

После прочтения dplyr - mutate: используйте имена динамических переменных , я подправил результаты, чтобы решить вашу проблему с незнанием имен столбцов заранее.

Используя , вы сохраняете столбцы, которые не найдены в существующем df, а затем динамически добавляете их с помощью цикла for.

Код

# load necessary package --------
library(tidyverse)
library(rlang)

# load necessary data -----------
df <-
  read_csv("L1,L3,L5
0.0000000,0.7142857,0.2857143
             0.1052632,0.8947368,0.0000000
             1.0000000,0.0000000,0.0000000
             0.0000000,1.0000000,0.0000000
             0.0000000,0.0000000,1.0000000
             1.0000000,0.0000000,0.0000000") 

# create function that creates one new column ------
FillNewColumns <- function(df, string) {
  require(dplyr)
  require(rlang)

  df %>%
  mutate(!!string := 0 )
}

# store the integers from the column names --------
integer.values <-
  df %>%
  names() %>%
  str_extract("\\d") %>%
  as.integer()

# identify max value from existing integer.values and add 1 ----
max.value <-
  integer.values %>%
  max() + 1

# identify the new columns -------
# note: this requires that you know the maximum value ahead of time
new.columns <-
  (1:max.value %in%
  integer.values == FALSE) %>%
  # take the indices of those TRUE values
  # which do not appear in 1:max.value and create
  # our new columns
  which() %>%
  paste0("L", .)

# dynamically add new columns to df ------
for (i in new.columns) {
  df <- FillNewColumns(df, i)
}

# tidy up the results ------
df <-
  df %>%
  # rearrange the columns in alphabetical order
  select(names(.) %>% sort())

# view results ----
df
# A tibble: 6 x 6
#      L1    L2    L3    L4    L5    L6
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 0         0 0.714     0 0.286     0
# 2 0.105     0 0.895     0 0         0
# 3 1         0 0         0 0         0
# 4 0         0 1         0 0         0
# 5 0         0 0         0 1         0
# 6 1         0 0         0 0         0

# end of script #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...