Как изменить data.table для большого количества столбцов? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть data.table, который включает столбцы от P01 до PP20 и от S01 до S20. Теперь я хотел бы добавить еще 20 столбцов с помощью функции mutate:

library(dplyr)

production50m <- mutate(production50m, S01_P01 = S01 / P01)
production50m <- mutate(production50m, S02_P02 = S02 / P02)
production50m <- mutate(production50m, S03_P03 = S03 / P03)
production50m <- mutate(production50m, S04_P04 = S04 / P04)
production50m <- mutate(production50m, S05_P05 = S05 / P05)
production50m <- mutate(production50m, S06_P06 = S06 / P06)
production50m <- mutate(production50m, S07_P07 = S07 / P07)
production50m <- mutate(production50m, S08_P08 = S08 / P08)
production50m <- mutate(production50m, S09_P09 = S09 / P09)
production50m <- mutate(production50m, S10_P10 = S10 / P10)
production50m <- mutate(production50m, S11_P11 = S11 / P11)
production50m <- mutate(production50m, S12_P12 = S12 / P12)
production50m <- mutate(production50m, S13_P13 = S13 / P13)
production50m <- mutate(production50m, S14_P14 = S14 / P14)
production50m <- mutate(production50m, S15_P15 = S15 / P15)
production50m <- mutate(production50m, S16_P16 = S16 / P16)
production50m <- mutate(production50m, S17_P17 = S17 / P17)
production50m <- mutate(production50m, S18_P18 = S18 / P18)
production50m <- mutate(production50m, S19_P19 = S19 / P19)
production50m <- mutate(production50m, S20_P20 = S20 / P20)

Видимо, это не умный ход - написать 20 строк кода. Есть ли способы сделать это? Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Решение с использованием базы R, которая позволяет избежать многократного ввода команды mutate.Предполагая, что ваш фрейм данных называется dat с 40 столбцами как 20 из них с началом S, а другой 20 как P.dat2 - это окончательный результат.

# Select the columns from S01 to S20
dat_S <- dat[, sprintf("S%02d", 1:20)]

# Select the columns from P01 to P20
dat_P <- dat[, sprintf("P%02d", 1:20)]

# Calculate the new columns
dat_SP <- dat_S/dat_P

# Rename the columns
names(dat_SP) <- paste(sprintf("S%02d", 1:20), sprintf("P%02d", 1:20), sep = "_")

# Combine dat_SP to the original data frame
dat2 <- cbind(dat, dat_SP)

Если вы действительно работаете над data.table, мы все равно можем использовать ту же стратегию.Обратите внимание, что способ выбора столбца по именам отличается от обычного фрейма данных.

library(data.table)

# Convert to data.table
setDT(dat)

# Select the columns from S01 to S20
S_cols <- sprintf("S%02d", 1:20)
dat_S <- dat[, ..S_cols]

# Select the columns from P01 to P20
P_cols <- sprintf("P%02d", 1:20)
dat_P <- dat[, ..P_cols]

# Calculate the new columns
dat_SP <- dat_S/dat_P

# Rename the columns
names(dat_SP) <- paste(sprintf("S%02d", 1:20), sprintf("P%02d", 1:20), sep = "_")

# Combine dat_SP to the original data frame
dat2 <- cbind(dat, dat_SP)

ДАННЫЕ

set.seed(4749)

dat <- as.data.frame(matrix(runif(120), ncol = 40))
names(dat) <- c(sprintf("S%02d", 1:20), sprintf("P%02d", 1:20))
0 голосов
/ 12 мая 2018

Вот решение с использованием смеси dplyr, purrr и rlang.

library(dplyr)
library(purrr)
library(rlang)
# list of the variables you want to combine
library(stringr) # for str_pad function
var_names <- map(c("S", "P"), ~ paste0(., str_pad(1:20, 2, side = 'left', pad = '0')))

# create fake df since no data provided
df <- unlist(var_names) %>% 
  map_dfc(.f = function(x) {
    data_frame(!!x := rnorm(100, 40, 2))
  })

# solution - there are places this could be fancier, but this gets the job done
df2 <- map2_dfc(var_names[[1]], var_names[[2]], .f = function(x, y) {
  var_name = paste(x, y, sep = "_")
  data_frame(!!var_name := df[[x]]/ df[[y]])
}) %>%
  bind_cols(df, .)
0 голосов
/ 12 мая 2018

Вы можете указать на n -й столбец следующим образом:

myTable[,n]

, где n - номер столбца.Используйте цикл для перебора столбцов, над которыми вы хотите работать.Например:

for(n in 1:ncol(myTable){
myTable[,n] <- #put what you want the column to be here
}

Вы не можете добавлять новые столбцы в таблицу таким образом.Вместо этого вы можете сначала добавить пустые столбцы в таблицу:

myTable$name_of_new_column <- NA
...