Как добавить суффикс для нескольких переменных без учета NA? - PullRequest
0 голосов
/ 23 апреля 2019

Для этой таблицы необходимо добавить для каждой переменной _T без учета NA.

T1:

var1        var2     var3
Argentina   Italy     NA 
Mexico      Chile     NA
France      Hungary   NA
Spain       UK        NA

Я пробовал с этим кодом:

o_cols <- c("var1", "var2", "var3")
out_cols <- paste0(o_cols, "_T")
output <- data.table (data_base)
output[, c(out_cols) := lapply(.SD, function(x){paste0(x, "_T")}), .SDcols 
= o_cols]

var_cols <- paste0(o_cols, "_value")

Проблема в том, что все переменные, включая «NA», добавляются _T.

, конечный результат должен выглядеть так:

    var1_value      var2_value        var3

    Argentina_T     Italy_T             NA 
    Mexico_T        Chile_T             NA
    France_T        Hungary_T           NA
    Spain_T         UK_T                NA

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

Вы можете просто сделать,

df[!is.na(df)] <- paste0(df[!is.na(df)], '_T')
df
#         var1      var2 var3
#1 Argentina_T   Italy_T   NA
#2    Mexico_T   Chile_T   NA
#3    France_T Hungary_T   NA
#4     Spain_T      UK_T   NA
0 голосов
/ 23 апреля 2019

A data.table опция

library(data.table)
DT <- fread(text)
for (nm in names(DT)) {
  tmp <- paste0(DT[[nm]], "_T")
  set(DT, i = which(!is.na(DT[[nm]])), j = nm, value = tmp)
}
DT
#          var1      var2 var3
#1: Argentina_T   Italy_T   NA
#2:    Mexico_T   Chile_T   NA
#3:    France_T Hungary_T   NA
#4:     Spain_T      UK_T   NA

данные

text <- "var1        var2     var3
Argentina   Italy     NA 
Mexico      Chile     NA
France      Hungary   NA
Spain       UK        NA"
0 голосов
/ 23 апреля 2019

Почти. Вы можете добавить ifelse() к вашему lapply().

> result
       var1_T1    var2_T1 var3_T1
1 Argentina_T1   Italy_T1      NA
2    Mexico_T1   Chile_T1      NA
3    France_T1 Hungary_T1      NA
4     Spain_T1      UK_T1      NA

код

# Paste each value as "value_T1" if it is not NA 
result <- data.frame(lapply(df, function(x) ifelse(!is.na(x), paste0(x, "_T1"), x)), 
                     stringsAsFactors = FALSE)
# Convert each column name to "name_T1"
colnames(result) <- paste0(colnames(result), "_T1")

Данные

df <- read.table(text = "var1        var2     var3
Argentina   Italy     NA 
Mexico      Chile     NA
France      Hungary   NA
Spain       UK        NA", header = TRUE, as.is = TRUE)

Открытый вопрос: С какой логикой вы хотите преобразовать имена столбцов? Достаточно ли одного NA, чтобы не применять преобразование? Все ли значения должны быть NA, чтобы не делать этого?

...