使用 NA 从行中删除单元格
Removing cells from rows with NA
我有以下数据(列数可变)
> df1<-data.frame(F1=c(1,5,"NA",9),F2=c(2,5,"a","NA"),F3=c(1,"NA","o","NA"))
> df1
F1 F2 F3
1 1 2 1
2 5 5 NA
3 NA a o
4 9 NA NA
并且我想从行中删除 NA
个单元格,并将列缩小到仅包含其中包含信息的单元格。
> df2
F1 F2 F3
1 1 2 1
2 5 5
3 a o
4 9
谢谢!
首先,您可以使用此功能将所有非 NA 单元格向左移动:
df1 <- data.frame(F1=c(1,5,NA,9),F2=c(2,5,"a",NA),F3=c(1,NA,"o",NA))
df1 <- as.data.frame(t(apply(df1,1, function(x) { return(c(x[!is.na(x)],x[is.na(x)]) )} )))
colnames(df1) <- c("F1", "F2", "F3")
输出:
> print(df1)
F1 F2 F3
1 1 2 1
2 5 5 <NA>
3 a o <NA>
4 9 <NA> <NA>
其次,为了应用空白单元格而不是 NA 观察,您可以尝试:
df1 <- sapply(df1, as.character)
df1[is.na(df1)] <- " "
df1 <- as.data.frame(df1)
输出:
> print(df1)
F1 F2 F3
1 1 2 1
2 5 5
3 a o
4 9
注意:为了更好地检测观察结果,我将您的字符串“NA”更改为简单的 NA。我不确定您是否真的希望将 NA 值作为字符串来观察。
首先将您的数据框转换为字符(否则,如果您同时拥有数字和字符,这将是一个问题),然后应用行,移动值,用 NAs 填充
df2=sapply(df1,as.character)
t(
sapply(1:nrow(df1),function(i){
tmp=df1[i,df1[i,]!="NA"]
if (length(tmp)<ncol(df1)) {
tmp=c(tmp,rep("NA",ncol(df1)-length(tmp)))
}
tmp
})
)
F1 F2 F3
[1,] "1" "2" "1"
[2,] "5" "5" "NA"
[3,] "a" "o" "NA"
[4,] "9" "NA" "NA"
根据您的偏好,我选择在省略 "NA"
值后完成每一行,并使用 ""
作为一种空白值。但您可以选择用真实的 NA
值填充它们:
library(dplyr)
library(purrr)
df1 %>%
pmap_dfr(~ {x <- c(...)[c(...) != "NA"]
setNames(c(x, rep("", ncol(df1) - length(x))),
names(df1))})
# A tibble: 4 x 3
F1 F2 F3
<chr> <chr> <chr>
1 1 "2" "1"
2 5 "5" ""
3 a "o" ""
4 9 "" ""
我们可以试试下面的代码
df1[] <- t(apply(
df1,
1,
function(v) {
v[order(v == "NA")]
}
))
这给出了
> df1
F1 F2 F3
1 1 2 1
2 5 5 NA
3 a o NA
4 9 NA NA
我有以下数据(列数可变)
> df1<-data.frame(F1=c(1,5,"NA",9),F2=c(2,5,"a","NA"),F3=c(1,"NA","o","NA"))
> df1
F1 F2 F3
1 1 2 1
2 5 5 NA
3 NA a o
4 9 NA NA
并且我想从行中删除 NA
个单元格,并将列缩小到仅包含其中包含信息的单元格。
> df2
F1 F2 F3
1 1 2 1
2 5 5
3 a o
4 9
谢谢!
首先,您可以使用此功能将所有非 NA 单元格向左移动:
df1 <- data.frame(F1=c(1,5,NA,9),F2=c(2,5,"a",NA),F3=c(1,NA,"o",NA))
df1 <- as.data.frame(t(apply(df1,1, function(x) { return(c(x[!is.na(x)],x[is.na(x)]) )} )))
colnames(df1) <- c("F1", "F2", "F3")
输出:
> print(df1)
F1 F2 F3
1 1 2 1
2 5 5 <NA>
3 a o <NA>
4 9 <NA> <NA>
其次,为了应用空白单元格而不是 NA 观察,您可以尝试:
df1 <- sapply(df1, as.character)
df1[is.na(df1)] <- " "
df1 <- as.data.frame(df1)
输出:
> print(df1)
F1 F2 F3
1 1 2 1
2 5 5
3 a o
4 9
注意:为了更好地检测观察结果,我将您的字符串“NA”更改为简单的 NA。我不确定您是否真的希望将 NA 值作为字符串来观察。
首先将您的数据框转换为字符(否则,如果您同时拥有数字和字符,这将是一个问题),然后应用行,移动值,用 NAs 填充
df2=sapply(df1,as.character)
t(
sapply(1:nrow(df1),function(i){
tmp=df1[i,df1[i,]!="NA"]
if (length(tmp)<ncol(df1)) {
tmp=c(tmp,rep("NA",ncol(df1)-length(tmp)))
}
tmp
})
)
F1 F2 F3
[1,] "1" "2" "1"
[2,] "5" "5" "NA"
[3,] "a" "o" "NA"
[4,] "9" "NA" "NA"
根据您的偏好,我选择在省略 "NA"
值后完成每一行,并使用 ""
作为一种空白值。但您可以选择用真实的 NA
值填充它们:
library(dplyr)
library(purrr)
df1 %>%
pmap_dfr(~ {x <- c(...)[c(...) != "NA"]
setNames(c(x, rep("", ncol(df1) - length(x))),
names(df1))})
# A tibble: 4 x 3
F1 F2 F3
<chr> <chr> <chr>
1 1 "2" "1"
2 5 "5" ""
3 a "o" ""
4 9 "" ""
我们可以试试下面的代码
df1[] <- t(apply(
df1,
1,
function(v) {
v[order(v == "NA")]
}
))
这给出了
> df1
F1 F2 F3
1 1 2 1
2 5 5 NA
3 a o NA
4 9 NA NA