我有一个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参数
答案 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
请注意以下事项:
Series<n>
合并到一个列表中,因为这是导入文件的最佳方式。char
类型结束,因此该代码的工作方式也是如此。"NA"
,而不是NA
。因此,像is.na(...)
这样的测试将无效。编辑(对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)
最后,如果你透露了你的真实数据,那么就会容易得多。在开始!!