【问题标题】:How to add a suffix to multiples variables without considering NA?如何在不考虑 NAN 的情况下为多个变量添加后缀?
【发布时间】:2019-04-23 10:17:32
【问题描述】:

对于此表,必须为每个变量添加 _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

【问题讨论】:

  • 考虑NA意味着所有行都是NA?还是在还有非 NA 行时考虑 NA?

标签: r dataframe variables na string-concatenation


【解决方案1】:

你可以这样做,

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

【讨论】:

    【解决方案2】:

    几乎。您可以将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 才能不这样做?

    【讨论】:

      【解决方案3】:

      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"
      

      【讨论】:

        猜你喜欢
        • 2018-01-14
        • 2020-12-01
        • 1970-01-01
        • 2015-02-28
        • 1970-01-01
        • 2017-01-04
        • 2017-10-06
        • 2015-09-27
        • 2010-11-26
        相关资源
        最近更新 更多