【问题标题】:loop for renaming columns in r循环重命名r中的列
【发布时间】:2018-08-02 00:33:35
【问题描述】:

我有大量的数据,我想转换成长期的。但在此之前,我想重命名所有变量列名。

我的数据框中的第一个变量是 anagraphical(id、names 等),因此循环应该针对除前 9 列之外的所有列运行。

此外,由于数据很宽,我在代表不同年份(10 年)的列中重复了变量(应该具有相同的前缀)。

我在想这样的事情:

for (i in seq(10:440)){
  names(mydata)[i:i+10]<- paste("varname", 1:10, sep="_")
}

显然,它不起作用。但我需要这样的东西,“varname”也随 i 变化(我需要重新编码大约 45 个变量,重复 10 年)。

我的数据是这样的

id Operating_renvenue_last_yr Operating_renvenue_-1 Operating_renvenue-2 ... Fixed_assets_last_yr Fixed_assets-1 Fixed_assets-_2 
ESA08005449 1973859 1983692 2028124 ... 205824 205955 208695
ESA08000820 1044971 962639 912788 ... 100355 120558 135448
ESA17000852 1005575 1035578 1055304 ... 509555 520687 705777
ESA08800450 861971 812596 765714 ... 1120587 1130458 1145200

我想获得:

id            OR_1    OR_2     OR_3 ... FA_1    FA_2   FA_3 
ESA08005449 1973859 1983692 2028124 ... 205824 205955 208695
ESA08000820 1044971 962639 912788 ... 100355 120558 135448
ESA17000852 1005575 1035578 1055304 ... 509555 520687 705777
ESA08800450 861971 812596 765714 ... 1120587 1130458 1145200

【问题讨论】:

  • 请举一个可重现的例子。这样我们就能更好地帮助您。
  • 向我们展示您当前的列名以及您希望它们的外观。有点不清楚。
  • 发布您的问题:dput(names(YourData)[1:50])
  • id Operating_renvenue_last_yr Operating_renvenue_-1 Operating_renvenue-2 .... Fixed_assets_last_yr Fixed_assets-1 Fixed_assets-_2 ESA08005449 1973859 1983692 2028124 ESA08000820 1044971 962639 912788 ESA17000852 1005575 1035578 1055304 ESA08800450 861971 812596 765714
  • 有帮助吗?否则,我怎么能给出一个可重现的例子? Stata中是否有类似dataex的命令?谢谢

标签: r loops for-loop rename


【解决方案1】:
#sample data
set.seed(1)
df <- data.frame(id=1:4, replicate(5,sample(0:1,4,rep=TRUE)))

#define a list of varying "varname"
varname <- c('OR', 'FA')
#define how many times above "varname" repeat itself
n <- c(2, 3) #let's say that 'OR' repeats 2 times and 'FA' 3 times

#replace column name
names(df)[2:ncol(df)] <- unlist(mapply(function(x,y) paste(x, seq(1,y), sep="_"), varname, n))

输出是:

  id OR_1 OR_2 FA_1 FA_2 FA_3
1  1    0    0    1    1    1
2  2    0    1    0    0    1
3  3    1    1    0    1    0
4  4    1    1    0    0    1

【讨论】:

    【解决方案2】:

    简单案例场景 如果您有两个列数相同但名称不同的数据框或 csv,您需要重命名它们才能合并。

    那么

    names(df2)[1:ncol(df2)] <- paste0(names(df1)[1:ncol(df1)])
    

    其中,
    df1 具有您希望在 df2 中具有的列名。
    ncol 返回数字该特定数据框中的列数

    【讨论】:

    • 这与names(df2) &lt;- names(df1) 的作用相同。此外,此答案不适用于该问题。
    【解决方案3】:

    我建议您将工作分成小步骤。

    # Make a copy mydata column names
    newnames <- names(mydata)
    
    # Build input data
    mydata <- data.frame(a=1,b=2,c=3,d=4,e=5,e=6,e=7,e=8,f=9)
    for (i in seq(10:440)) mydata[[i]] <- 10
    
    # A vector of variable names for the sake of the example
    varnames <- paste('var', 1:45)
    
    # Set new variable names
    newnames[10:length(newnames)] <- paste(rep(varnames, each = 10)[1:(length(newnames)-9)], 1:10, sep = '_')
    
    # Commit your changes
    names(mydata) <- newnames
    
    # Result
    names(mydata)[1:20]
    

    【讨论】:

      【解决方案4】:

      如果“varnames”是变量名的向量,比如

      varnames<-c("OR", "FA", ..)
      

      你可以简单地运行

      names(mydata)[10:ncol(mydata)]<- paste0(rep(varnames, each=10), "_",1:10)
      

      给你

      names(mydata)[10:ncol(mydata)]
      
       "OR_1"  "OR_2"  "OR_3"  "OR_4"  "OR_5"  "OR_6"  "OR_7"  "OR_8"  "OR_9"  "OR_10" "FA_1"  "FA_2"  "FA_3"  "FA_4"  "FA_5"  "FA_6"  "FA_7"  "FA_8" 
       "FA_9"  "FA_10" ...
      

      但请注意,这只是正确的,如果每个变量具有相同的重复次数!

      【讨论】:

        猜你喜欢
        • 2018-07-16
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 2014-06-17
        • 1970-01-01
        • 2014-08-30
        • 1970-01-01
        相关资源
        最近更新 更多