R-在多个参数上应用if语句的最佳方式



示例:假设我有两个数据帧

DF1 = data.frame(V1 = c("","A", "B"), V2 = c("x",0,1), V3 = c("y",2,3), V4 = c("z",4,5))
DF2 = data.frame(V1 = c("","A", "B"), V2 = c("x",6,7), V3 = c("y",8,9), V4 = c("z",0,0))

所以

> DF1                > DF2
V1 V2 V3 V4          V1 V2 V3 V4
1     x  y  z        1     x  y  z
2  A  0  2  4        2  A  6  8  0
3  B  1  3  5        3  B  7  9  0

我想把第一行作为列名,所以

>DF1                > DF2
x y z               x y z
1 A 0 2 4           1 A 6 8 0
2 B 1 3 5           2 B 7 9 0

我所做的就是

if("V2" %in% names(DF1)){
names(DF1) = as.character(unlist(DF1[1,]))
DF1 = DF1[-1, ]
}
if("V2" %in% names(DF2)){
names(DF2) = as.character(unlist(DF2[1,]))
DF2 = DF2[-1, ]
}

这就是我们在这个例子中想要的。

问题:避免此处出现两个if语句的最佳方法是什么?我想到的第一件事是在循环中迭代两个DFs,但这不起作用,因为你必须重命名DFs(至少对我不起作用)

或者更一般地说,如何避免对循环不起作用的多个参数执行相同的操作

我们可以从janitor使用row_to_names

library(janitor)
DF1 <- row_to_names(DF1, 1)
DF2 <- row_to_names(Df2, 1)

肯定有更好的方法,但在有人给出之前,我认为这段代码是有效的:

DF1 = data.frame(V1 = c("","A", "B"), V2 = c("x",0,1), V3 = c("y",2,3), V4 = c("z",4,5))
DF2 = data.frame(V1 = c("","A", "B"), V2 = c("x",6,7), V3 = c("y",8,9), V4 = c("z",0,0))
FUNK = function(x){
if("V2" %in% names(x)){
names(x) = as.character(unlist(x[1,]))
x = x[-1, ]
}
return(x)
}
list1 = list(DF1,DF2)
list2 = lapply(1:2,FUN = function(x) FUNK(list1[[x]]))
for (i in 1:2){
assign(paste0("DF",i),list2[[i]])
}

该函数只执行if语句,然后将其应用于数据帧列表,然后使用"将新的数据帧分配给原始名称;分配";作用

在这个问题中,您可以避免使用if条件。这是你想要的吗?


ls <- list(DF1,DF2)
for (k in 1:length(ls)) {
names(ls[[k]]) <- ls[[k]] %>% slice(1) %>% unlist()
assign(paste0("DF",k),ls[[k]][-1,])
}

row.names(DF1) <- NULL
row.names(DF2) <- NULL

输出

> DF1
x y z
1 A 0 2 4
2 B 1 3 5
> DF2
x y z
1 A 6 8 0
2 B 7 9 0

最新更新