【发布时间】:2016-12-21 18:13:26
【问题描述】:
我认为我面临一个非常简单的问题。
示例数据:
example=data.frame(x=c(1,2,3,4,5,6,7,8), y=c(1,2,3,X,X,X,7,8), z=c(1,2,3,4,5,6,7,8))
看起来像这样:
x y z
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 8 8 8
这是理想的情况。因为我的数据采用单列格式,所以我将其格式化为这样的数据框。现在有时(不是在每次观察中)都会有一个附加值总是出现在同一个地方(例如,在将其格式化为 DF 后总是在同一列中)。
看起来像这样:
data.frame(x=c("X1","X2","X3","X4","X5","X6","X7","X8"),
y=c("Y1","Y2","Y3","A38","A15","A8","Y7","Y8"),
z=c("Z1","Z2","Z3","Y4","Y5","Y6","Z7","Z8"),
aa=c(NA,NA,NA,"Z4","Z5","Z6",NA,NA))
导致:
x y z aa
1 X1 Y1 Z1 <NA>
2 X2 Y2 Z2 <NA>
3 X3 Y3 Z3 <NA>
4 X4 A38 Y4 Z4
5 X5 A15 Y5 Z5
6 X6 A8 Y6 Z6
7 X7 Y7 Z7 <NA>
8 X8 Y8 Z8 <NA>
最初创建“aa”列只是因为我在原始单列格式文件中有一个附加值(A 东西)。我想将 A 值保存在它们的列中(例如,总是以 A 开头),我并不真正关心“aa”。我只想像这样改变所有值:
x y z aa A
1 X1 Y1 Z1 <NA> <NA>
2 X2 Y2 Z2 <NA> <NA>
3 X3 Y3 Z3 <NA> <NA>
4 X4 Y4 Z4 Z4 A38
5 X5 Y5 Z5 Z5 A15
6 X6 Y6 Z6 Z6 A8
7 X7 Y7 Z7 <NA> <NA>
8 X8 Y8 Z8 <NA> <NA>
为了这个例子,我在这里放了几列,但实际情况下可能有多达 300 列,所以几乎这个数量的值要左移到我们在其中找到 NA 的点行。
到目前为止,我已经使用此代码解决了这种类型的问题:
format_A_things <- function(df, col) {
x <<- grep("A", df$ColumnWhereAareExpected) #selecting lines starting with an A
if (length(x) > 0){
for (i in x){
df[i,"SpecificColumnforA"] = df[i,col]
for (j in col:(ncol(df)-2)){
if (is.na(df[i,j]) | is.na(df[i,j+1])){
df[i,j] = NA
} else {
df[i,j] = df[i,j+1]
}
}
}
}
return(df)
}
这工作得很好,期待它很慢(我可能有几百行要通过,这需要几十分钟,这并不理想)。我知道我可能用最慢的方式来做这类事情,因此我向你们提出问题。我怎样才能达到这样的结果。
提前感谢您的帮助!
【问题讨论】:
-
sel <- grepl("A", df$ColumnWhereAareExpected, fixed = TRUE); df[sel, "A"] <- df[sel, "ColumnWhereAareExpected") -
什么是
df$ColumnWhereAareExpected?那些A值是否总是出现在某个列中,或者它们可以出现在任何列中? -
正是你所说的:出现时,总是在同一列。在这个例子中是“y”,所以我应该说 df$y 来匹配我的例子......
-
谢谢罗兰。可以快速选择值并将它们保存在我想要的位置,但这并不能解决我的核心问题,即左移所有值。
-
要扩展 Rolands 评论,为了移动单元格,你可以做
df[sel, c("y", "z")] <- df[sel, c("z", "aa")](对于你的具体例子)