我相信我面临一个非常简单的问题。
示例数据:
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 something)。我想在其列中保存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)
}
这很好,期待它很慢(我可能有几百行要经过,而且需要几十分钟,这并不理想)。我知道我可能用最慢的方式来做这类事情,因此我向你们提问。我如何实现这样的结果。
提前感谢您的帮助!
答案 0 :(得分:0)
基于评论,以下是我如何转换我的函数来执行操作:
var Keycloak = require('keycloak-js');
var kc = Keycloak('./keycloak.json');
kc.init().success(function(authenticated) {
alert(JSON.stringify(kc.tokenParsed));
}).error(function() {
alert('failed to initialize');
});
我希望随着时间的推移并在结束时重置选择,如果需要,它会经历几次。它没有,所以当我调用我的函数时,我再次使用选择,如果countString <- function(df, col, str) {
sel <<- grepl(str, df[,col], fixed = TRUE)
while (any(sel)){
df[sel,"Column"] = df[sel,"Column"] + 1
df[sel, c(col:(ncol(df)-2))] <- df[sel, c(col+1:(ncol(df)-3))]
sel <<- grepl(str, df[,col], fixed = TRUE)
}
return(df)
}
为真,那么我再次调用这个函数。
无论如何,它比我以前的方法快得多,这是我们的主要目的。
感谢大家的帮助。