r-对新创建的数字变量排序



我基于两个数值变量创建了一个交互项。我希望较小的数字总是出现在交互值中的第一个(除了0,我希望它总是出现在最后(。

这是我用来生成新变量的代码,但我不知道如何使较小的数字先出现(无论它来自哪个变量,inter1或inter2(。

Recent$interaction <- cbind(paste(Recent$inter1, Recent$inter2))

我还成功地使用以下代码创建了交互:

Recent$interaction <- as.numeric(paste(Recent$inter1, Recent$inter2, sep = "")

谢谢!

样本数据:

inter1inter2
53
27
57
57
37
51
20

我认为你的问题中最棘手的部分是你希望0是最后一个。因此,我们不能简单地使用一列作为数字,因为排列函数总是把0放在第一位。

解决方案是使排序列成为因子变量。因此,让我们从创建一个示例数据开始。

data1 <- data.frame(inter1 = c(5,2,3,0,5,6))
data2 <- data.frame(inter2 = c(2,3,4,5,6,0))

接下来,我将把它们组合起来。

combine <- cbind(data1, data2)

如果你只想对这些代码进行排序,那就行了。

combine %>%
arrange(
inter1
)

但由于您希望0是最后一个,但仍按数字排序。我们需要更改一个排序变量,我认为在这种情况下,它是因子变量。

combine$inter1 <- factor(
combine$inter1,
levels = c(2,3,4,5,6,0)
)

然后我们再试一次

combine %>%
arrange(
inter1
)

你应该得到你想要的。这种方法的问题是,如果您的值在0到999999之间。然后,级别方法将过于繁琐,无法手动输入订单。但我的解决方案是基于您提供的数据,这些数据只是几个数字。

如果您有太多的唯一值需要手动放入级别,请告诉我,然后我们可以使用另一种方法。

您可以使用case_when来指定不同的条件。

with(df, dplyr::case_when(inter1 == 0 ~ paste0(inter2, inter1), 
inter2 == 0 ~ paste0(inter1, inter2), 
TRUE ~ paste0(pmin(inter1, inter2), 
pmax(inter1, inter2))))
#[1] "35" "27" "57" "57" "37" "15" "20"

数据

df <- structure(list(inter1 = c(5, 2, 5, 5, 3, 5, 2), inter2 = c(3L, 
7L, 7L, 7L, 7L, 1L, 0L)), class = "data.frame", row.names = c(NA, -7L))

最新更新