问题描述
我想创建一个表格,其中包含原始数据框中缺失值的行位置。这实际上将第一个表作为输入并在该表下方创建表。
我知道我可以使用 apply 来创建具有该行位置的列表,但我正在努力获取该列表并制作数据框。
# Minimum working example
# Create dataset
data0 <- data.frame("A" = c(NA,NA,1,1),"B"= c(1,"C"= c("john","john",NA),"D"= c("john","john"))
# Create list of all rows containing missing values for a particular column then print as dataframe
list1<-apply(is.na(data0),2,which)
> print(list1)
$A
[1] 1 2
$B
[1] 2
$C
[1] 3 4
$D
integer(0)
# Turn list1 to a data.frame leading to answer
解决方法
用 list
循环 sapply
,将 length
分配给 'data0' 的 nrow
,在末尾附加 NA
元素并用 data.frame
as.data.frame(sapply(list1,`length<-`,nrow(data0)))
-输出
A B C D
1 1 2 3 NA
2 2 NA 4 NA
3 NA NA NA NA
4 NA NA NA NA
我们也可以这样做
library(dplyr)
data0 %>%
mutate(across(everything(),~ replace(rep(NA_integer_,n()),is.na(.),which(is.na(.)))[order(!is.na(.))]))
A B C D
1 1 2 3 NA
2 2 NA 4 NA
3 NA NA NA NA
4 NA NA NA NA
如果我们不需要对值进行排序,即位置保持在相同的出现位置
NA^(!is.na(data0)) * row(data0)
A B C D
[1,] 1 NA NA NA
[2,] 2 2 NA NA
[3,] NA NA 3 NA
[4,] NA NA 4 NA
,
使用 library(elevatr)
library(rgdal)
lat <- c(45.08323,40.08323)
long <- c(-82.46797,-81.46797)
df <- data.frame(long,lat)
get_elev_point(df,prj="EPSG:4326")
# Note: Elevation units are in &units=Meters
# Note:. The coordinate reference system is:
# GEOGCRS["WGS 84 (with axis order normalized for visualization)",# DATUM["World Geodetic System 1984",# ELLIPSOID["WGS 84",6378137,298.257223563,# LENGTHUNIT["metre",1]]],# PRIMEM["Greenwich",# ANGLEUNIT["degree",0.0174532925199433]],# CS[ellipsoidal,2],# AXIS["geodetic longitude (Lon)",east,# ORDER[1],# ANGLEUNIT["degree",0.0174532925199433,# ID["EPSG",9122]]],# AXIS["geodetic latitude (Lat)",north,# ORDER[2],9122]]]]
# coordinates elevation elev_units
# 1 (-82.46797,45.08323) NA meters
# 2 (-81.46797,40.08323) 271.82 meters
并从 sapply
开始,您可以执行 -
data0