微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建包含缺失值行位置的数据框

如何解决创建包含缺失值行位置的数据框

我想创建一个表格,其中包含原始数据框中缺失值的行位置。这实际上将第一个表作为输入并在该表下方创建表。

enter image description here

我知道我可以使用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。