R代码用于对齐列长度

时间:2014-03-12 13:06:44

标签: r alignment

我有一个data.frame,其中包含不同长度的列,我正在尝试根据每列中的最后一个值进行对齐。前5行包含我不能丢弃的特定识别信息。

我一直在使用excel中的代码,它完全符合我的要求,但希望我可以使用类似的代码在R中执行相同的过程。

示例data.frame(实际数据集大得多):

  

Series1&lt; - c(“Lync”,“23017323003”,“2011”,“sp1”,“45.6”,“2.4”,“3.1”,“1.9”,“6.6”,“1.4”)<登记/>   Series2&lt; - c(“Lync”,“23017323003”,“2010”,“sp2”,“52.8”,“3.8”,“2.5”,“4.3”,“NA”,“NA”)
  Series3&lt; - c(“Faye”,“23011195006”,“2011”,“sp1”,“63.1”,“1.3”,“5.2”,“0.7”,“3.1”,“NA”)
  df&lt; - data.frame(Series1,Series2,Series3)

预期输出data.frame:

  

Row_Names&lt; - c(“Town”,“SiteID”,“EndYear”,“Subplot”,“PathLength”,“2007”,“2008”,“2009”,“2010”,“2011”)<登记/>   Series1fix&lt; - c(“Lync”,“23017323003”,“2011”,“sp1”,“45.6”,“2.4”,“3.1”,“1.9”,“6.6”,“1.4”)
  Series2fix&lt; - c(“Lync”,“23017323003”,“2010”,“sp2”,“52.8”,“NA”,“3.8”,“2.5”,“4.3”,“NA”)
  Series3fix&lt; - c(“Faye”,“23011195006”,“2011”,“sp1”,“63.1”,“NA”,“1.3”,“5.2”,“0.7”,“3.1”)
  FixedDF&lt; - data.frame(Row_Names,Series1fix,Series2fix,Series3fix)

有人帮助我的excel代码如下:

Sub shift_to_last_row()

Dim LastRowOnSheet As Long
Dim LastRowInColumn As Long
Dim LastColumn As Long
Dim col As Long
Dim arr As Variant

With Cells
LastRowOnSheet = .Find("*", .Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False, False).Row
LastColumn = .Find("*", .Cells(1, 1), xlFormulas, xlPart, xlByColumns, xlPrevious, False, False).Column
End With

For col = 1 To LastColumn
    LastRowInColumn = Cells(Rows.Count, col).End(xlUp).Row
    If LastRowInColumn <> LastRowOnSheet Then
    arr = Range(Cells(6, col), Cells(LastRowInColumn, col))
    Range(Cells(6, col), Cells(LastRowOnSheet, col)).ClearContents
    Range(Cells(6 + LastRowOnSheet - LastRowInColumn, col), Cells(LastRowOnSheet, col)) = arr
    End If
Next col

关于如何在R中执行此操作的任何想法都会很棒。我有大约150个文件来执行此操作,每个文件包含大约50列和150行。

修改 我正在使用的真实data.frame的示例子集。

  

结构(c(“23017323003sp4”,“2011”,“40”,“2/18/2014”,“13:40:54”,   “67.9709”,“2.516”,“2.510”,“1.095”,“1.721”,“0.574”,“0.730”,   “0.924”,“0.585”,“1.565”,“1.208”,“1.104”,“0.842”,“0.671”,   “1.399”,“1.136”,“2.005”,“0.946”,“1.114”,“1.191”,“1.192”,   “2.217”,“2.528”,“3.706”,“2.899”,“2.646”,“1.698”,“1.815”,   “3.647”,“2.141”,“2.080”,“1.022”,“1.610”,“2.25”,“2.844”,   “2.651”,“1.554”,“1.538”,“0.958”,“1.290”,“1.253”,“23017323003sp4”,   “2011”,“40”,“2014年2月18日”,“13:40:54”,“51.4189”,“0.894”,“0.977”,   “0.308”,“0.670”,“0.357”,“0.151”,“0.208”,“0.256”,“0.418”,   “0.591”,“1.119”,“0.758”,“1.616”,“1.698”,“1.003”,“1.774”,   “1.348”,“1.088”,“0.979”,“0.992”,“1.408”,“1.312”,“1.828”,   “1.429”,“1.243”,“1.093”,“2.027”,“2.205”,“1.637”,“1.456”,   “1.311”,“1.531”,“1.97”,“2.182”,“2.217”,“2.128”,“2.402”,   “1.471”,“1.561”,“1.449”,“23017323003sp4”,“2011”,“19”,“2/18/2014”,   “13:40:54”,“36.6195”,“1.631”,“2.290”,“1.652”,“1.348”,“1.335”,   “1.936”,“3.442”,“2.258”,“1.883”,“1.463”,“1.282”,“1.557”,   “2.282”,“2.737”,“2.736”,“2.388”,“1.346”,“1.388”,“1.240”,   NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,   NA,NA,NA,NA,NA),. Dim = c(46L,3L),. Dimnames = list(c(“V2”,   “V3”,“V9”,“V13”,“V14”,“V112”,“V113”,“V114”,“V115”,“V116”,   “V117”,“V118”,“V119”,“V120”,“V121”,“V122”,“V123”,“V124”,   “V125”,“V126”,“V127”,“V128”,“V129”,“V130”,“V131”,“V132”,   “V133”,“V134”,“V135”,“V136”,“V137”,“V138”,“V139”,“V140”,   “V141”,“V142”,“V143”,“V144”,“V145”,“V146”,“V147”,“V148”,   “V149”,“V150”,“V151”,“V152”),c(“LY3A003B”,“LY3A004A”,“LY3A004B”   )))

使用jlhoward建议的代码,我尝试了以下内容(上面的data.frame示例标题为“Lync3rwlTrans”:

  

series&lt; - as.vector(Lync3rwlTrans [,3])
  结果&lt; - do.call(cbind,lapply(series,function(s){
  + data&lt; -s [7:46]
  + data&lt; - data [data!=“NA”]
  + end&lt; - 40-(2011-as.numeric(s [2]))
  + start&lt; - end-length(data)+1
  + ret&lt; - rep(“NA”,40)
  + ret [start:end]&lt; - data
  + return(c(s [1:6],ret))
  +}))
  rownames(结果)&lt; - c(“SiteID”,“EndYear”,“#Ring”,“EditDate”,“EditTime”,“PathLength”,1972:2011)
  结果&lt; - data.frame(结果,stringsAsFactors = F)
  结果

但是,我一直收到以下错误: 开始时出错:结束:NA / NaN参数

1 个答案:

答案 0 :(得分:1)

这似乎有效。

series <- list(Series1,Series2,Series3)
result <- do.call(cbind,lapply(series,function(s){
  data  <- s[6:10]
  data  <- data[data!="NA"]
  end   <- 5-(2011-as.numeric(s[3]))
  start <- end-length(data)+1
  ret <- rep("NA",5)
  ret[start:end] <- data
  return(c(s[1:5],ret))
}))
rownames(result) <- c("Town", "SiteID", "EndYear", "Subplot", "PathLength", "2007", "2008","2009", "2010", "2011")
result <- data.frame(result, stringsAsFactors=F)
result
#                     X1          X2          X3
# Town              Lync        Lync        Faye
# SiteID     23017323003 23017323003 23011195006
# EndYear           2011        2010        2011
# Subplot            sp1         sp2         sp1
# PathLength        45.6        52.8        63.1
# 2007               2.4          NA          NA
# 2008               3.1         3.8         1.3
# 2009               1.9         2.5         5.2
# 2010               6.6         4.3         0.7
# 2011               1.4          NA         3.1

请注意以下事项:

  1. 我将Series<n>合并到一个列表中,因为这是导入文件的最佳方式。
  2. 在您的示例中,所有内容都以char类型结束,因此该代码的工作方式也是如此。
  3. 您的NA也是char,例如"NA",而不是NA。因此,像is.na(...)这样的测试将无效。
  4. 编辑(对OP&#39的后续问题的回应)

    所以有两个问题。首先,"NA"NA之间存在差异。第一个是字符串,您可以使用它来测试,例如data=="NA"。第二个是你测试使用的R值NA,例如is.na(data)我在上面的笔记中对此进行了解释。在您的&#34;示例数据&#34;中,您有"NA",我将其存入代码中。在您的&#34;真实数据&#34;中,您有NA,因此代码不起作用。这就是你得到错误的原因。取代

    data <- data[data!="NA"]
    

    data <- data[!is.na(data)]
    

    其次,如果你的&#34;真实数据&#34;在字符矩阵Lync3rwlTrans中,使用

    df <- data.frame(Lync3rwlTrans,stringsAsFactors=F)
    result <- do.call(cbind,lapply(df, function(s)...)
    

    这会将Lync3rwlTrans转换为数据框并将该列传递给重新对齐函数。

    完整的代码是:

    df <- data.frame(Lync3rwlTrans,stringsAsFactors=F)
    result <- do.call(cbind,lapply(df,function(s){
      data  <- s[7:46]
      data  <- data[!is.na(data)]
      end   <- 40-(2011-as.numeric(s[2]))
      start <- end-length(data)+1
      ret <- rep(NA,40)
      ret[start:end] <- data
      return(c(s[1:6],ret))
    }))
    rownames(result) <- c("SiteID", "EndYear", "#Rings", "EditDate", "EditTime", "PathLength", 1972:2011)
    result <- data.frame(result, stringsAsFactors=F)
    

    最后,如果你透露了你的真实数据,那么就会容易得多。在开始!!