反转 r 数据帧中非 NA 值的顺序

问题描述 投票:0回答:2

我希望反转 R 数据框多列中数值的顺序(以便最高数字变为最低数字,依此类推),同时保留 NA 值。

我的数据框示例:

my_data <- data.frame (animal  = c("fox", "rabbit", "cow", "sheep", "pig", "mole"),
                        x = c("1", "2", "1", "3", "NA", 'NA'),
                       y = c('NA','NA','1','3','2','NA'),
                       z = c('1','2','3','4','NA','5'),
                       area = c("field","field","farm","farm","farm","farm"))

然后,我想要达到的目标:

my_ideal_data <- data.frame (animal  = c("fox", "rabbit", "cow", "sheep", "pig", "mole"),
                             x = c("3", "2", "3", "1", "NA", 'NA'),
                             y = c('NA','NA','3','1','2','NA'),
                             z = c('5','4','3','2','NA','1'),
                             area = c("field","field","farm","farm","farm","farm"))

“动物”和“区域”列保持不变,所有 NA 也是如此——但我需要将 x、y 和 z 中的值按相反顺序放置在每一列中。

任何帮助将不胜感激!

谢谢

r dataframe sorting na
2个回答
0
投票

在这些数据中,您可以在转换为数字后从

z
列中简单地减去6:

my_data$z <- 6 - as.numeric(my_data$z)  

#> my_data
#  animal  x  y  z  area
#1    fox  3 NA  5 field
#2 rabbit  2 NA  4 field
#3    cow  3  3  3  farm
#4  sheep  1  1  2  farm
#5    pig NA  2 NA  farm
#6   mole NA NA  1  farm

如果这些样本数据过于简单,另一种方法是使用

grep
索引非 NA 值,然后使用
gtools::mixedsort()
按递减值排序,然后使用 [indexing] 替换这些值。这可能更具可扩展性,您不必转换为数字。

idx <- grep("\\d+", my_data$z)
vals <- gtools::mixedsort(my_data$z[idx], decreasing = TRUE)
my_data$z[idx] <- vals

#  animal  x  y  z  area
#1    fox  3 NA  5 field
#2 rabbit  2 NA  4 field
#3    cow  3  3  3  farm
#4  sheep  1  1  2  farm
#5    pig NA  2 NA  farm
#6   mole NA NA  1  farm

0
投票

你可以在这里使用 for 循环。

首先将所有“NA”字符替换为真正的

NA
.

my_data[my_data == "NA"] <- NA

然后定义一个包含要排序的列的向量。

target_col <- c("x", "y", "z")

并使用 for 循环遍历目标列并通过对非 NA 值进行排序来执行替换。

for (i in target_col) {
  my_data[!is.na(my_data[,i]),i] <- sort(my_data[!is.na(my_data[,i]),i], decreasing = T)
}

  animal    x    y    z  area
1    fox    3 <NA>    5 field
2 rabbit    2 <NA>    4 field
3    cow    1    3    3  farm
4  sheep    1    2    2  farm
5    pig <NA>    1 <NA>  farm
6   mole <NA> <NA>    1  farm
© www.soinside.com 2019 - 2024. All rights reserved.