如何将一个数据帧列中的N个值交换为N的任何值和任何n(行)?

蜜雪儿

我有包含“年龄差异”列(AgeDiff)的数据框数据框如下所示:

library("dplyr")

test <- data.frame("Age1"=c(42, 48, 58, 25, 53, 55, 32, 58, 71, 24, 48, 48, 64, 55, 45, 55, 34, 33, 51, 22), 
                   "Age2"=c(8, 2, 1, 16, 14, 1, 11, 14, 0, 5, 2, 10, 16, 13, 3, 4, 8, 13, 8, 5)) 
test <- test %>%
mutate(AgeDiff = Age1 - Age2)

对于我正在编写的功能,用户可以输入拒绝最小差和/或拒绝最大差。小于/大于任一阈值的任何年龄差异都会创建“超出范围”的年龄差异。

在我正在做的工作中,任何小于18岁或大于54岁的年龄差异都是“超出范围”的。碰巧的是(我在两组年龄中都使用了随机数生成器),恰好有两个年龄差异太小,两个年龄差异太大。

我可以找到“太年轻”或“太老”的最大值,例如通过比较

TooYoung <- test %>%
filter(AgeDiff < 18) %>%
summarise(Count = n()) %>%
pull(Count)

TooOld <- test %>%
filter(AgeDiff > 54) %>%
summarise(Count = n()) %>%
pull(Count)

然后算出哪个值更大。较大的TooYoungTooOld使我可以交换test数据中的行数

我可以对test数据框进行(预)排序,使其AgeDiff值递增:

test <- test %>%
arrange(AgeDiff)

这给了我想要的顺序,其中数据帧从最极端的AgeDiff最小值到最极端的AgeDiff最大值排序现在我想要做的是交换的最顶部和最底部Age1值最大的TooYoungTooOld因为在此例中,我的最大“超出范围”最小值/最大值为2,所以我需要交换:

  • Age1在第1行和Age1第20行
  • Age1在第2行和Age1第19行

交换是否导致“超出范围”并不重要AgeDiff

交换的数据帧可以是任何长度。要进行的交换数量可以是任意数量,包括0。因此,对于任何交换值> 0而言,问题就变成了,

  • Age1在第1行Age1nrow(foo)
  • Age1在第2行Age1nrow(foo)-1
  • 进行交换的次数等等。

AgeDiff进行交换后将重新计算。我的数据框中还有其他变量,例如Sex,因此仅Age1交换值至关重要

行的重新排序并不重要。唯一的要求是解决方案交换正确的Age1

我搜索了类似的问题,但发现的问题却大不相同。另一个问题是对于该数据帧的初始百分比的两行互换两个已知值的相互交换交换整个行两个随机选择的行的交换基于分组变量值互换在我的问题中,交换次数将确定地计算,但是种群之间的数目不同,Age1交换值将有所不同,Age1交换值的数目必须恰好是最大的“超出范围”计数,并且没有分组变量。

编辑添加:假设您有我的数据并完成了排列,您将看到第1行如下所示:

Age1    Age2    AgeDiff
25      16      9

第20行如下所示:

Age1    Age2    AgeDiff
71      0       71

交换后这两行将是:第1行:

Age1    Age2    AgeDiff
71      16      9

第20行:

Age1    Age2    AgeDiff
25      0       71

因此只Age1交换了两个值。

然后将第2行和第19行交换,最后得到

第2行

Age1    Age2    AgeDiff
58      5       17

对于第19行

Age1    Age2    AgeDiff
22      1       57

AgeDiff列将被忽略,因为完成交换后将重新计算列。

(我也错过了最初的数据帧也应该称为测试,现在我已经解决了。)

用户名

我肯定有一种更整洁的方式来做到这一点,但是...

library("dplyr")
test <- data.frame("Age1"=c(42, 48, 58, 25, 53, 55, 32, 58, 71, 24, 48, 48, 64, 55, 45, 55, 34, 33, 51, 22), 
                   "Age2"=c(8, 2, 1, 16, 14, 1, 11, 14, 0, 5, 2, 10, 16, 13, 3, 4, 8, 13, 8, 5)) 
test <- test %>%
  mutate(AgeDiff = Age1 - Age2) %>% 
  arrange(AgeDiff) %>% 
  dplyr::mutate(row_no = row_number())
test

swap <- function(df) {
  TooYoung <- df %>%
    filter(AgeDiff < 18) %>%
    summarise(Count = n()) %>%
    pull(Count)
  
  TooOld <- df %>%
    filter(AgeDiff > 54) %>%
    summarise(Count = n()) %>%
    pull(Count)
  
  top_bottom <- max(TooYoung, TooOld)
  
  df2 <- df %>% 
    filter(row_number() > max(row_number()) - top_bottom | row_number() <= top_bottom) %>% 
    mutate(final_age1 = Age1) %>% 
    dplyr::select(final_age1, row_no)
  df2$row_no <- sort(df2$row_no, decreasing = T)
  
  df_final <- df %>% 
    left_join(df2) %>% 
    mutate(final_age1 = ifelse(is.na(final_age1), Age1, final_age1)) %>% 
    dplyr::select(-Age1, -row_no)
             
  df_final
}
swap(test)

我想给你你想要的?

# Joining, by = "row_no"
#    Age2 AgeDiff final_age1
# 1    16       9         71
# 2     5      17         58
# 3     5      19         24
# 4    13      20         33
# 5    11      21         32
# 6     8      26         34
# 7     8      34         42
# 8    10      38         48
# 9    14      39         53
# 10   13      42         55
# 11    3      42         45
# 12    8      43         51
# 13   14      44         58
# 14    2      46         48
# 15    2      46         48
# 16   16      48         64
# 17    4      51         55
# 18    1      54         55
# 19    1      57         22
# 20    0      71         25

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将行值保留到另一个数据帧的第n个行值

来自分类Dev

如何将列中的 NULL 值交换为最后一个非 NULL 值?

来自分类Dev

如何将一个数据帧中某些列的值与另一数据帧中同一列集的值进行比较?

来自分类Dev

如何将一个数据帧的值与另一个数据帧中的值进行比较?

来自分类Dev

如何将列转换为以另一个数字列中的值为条件的和?

来自分类Dev

如何将数据帧列的所有元素与另一个数据帧中为该列指定的值相乘?

来自分类Dev

如何将一个数据帧的一行的EACH值与另一数据帧的一行的所有值相乘

来自分类Dev

Python:如何在不删除重复项的情况下将一个数据帧中的列值替换为另一个

来自分类Dev

根据另一个数据帧中的值将数据帧的列相乘

来自分类Dev

当重复的行具有不同的值时,如何将重复的行合并为一个数据帧

来自分类Dev

如何将一个数据帧中的一行的值与另一个数据帧中的多个行进行比较(包括计算)

来自分类Dev

如何将一个数据框列直接转换为以列值作为列索引的数据框?

来自分类Dev

如何将两个数据帧中的行合并为 R 中的一个数据帧?

来自分类Dev

如何将一个数组中的值分配给另一个数组n次

来自分类Dev

如何将 8 个数据帧组合成一个 GGplot(或任何东西)

来自分类Dev

将值从一个数据帧替换为另一个

来自分类常见问题

在R中,如何将一个数据框中选定行中的值与另一数据框中选定列的值进行匹配?

来自分类Dev

在R中,如何将一个数据框中选定行中的值与另一数据框中选定列的值进行匹配?

来自分类Dev

将一个数据帧中的NA值替换为第二个数据帧中的值

来自分类Dev

如果匹配另一个数据帧的 ID,则添加来自 n 个数据帧的值

来自分类Dev

如何根据时间顺序和数据帧中重复的值分配一个从1到N开始的新列?

来自分类Dev

从列中的另一个数据帧返回具有不同值的行

来自分类Dev

如何成对地遍历大量数据帧并将值存储在一个 * n 矩阵中?

来自分类Dev

将一个数据帧中的n行的子集绑定到多个其他数据帧中的不同n行的子集

来自分类Dev

如何将数据帧(df)列的每个值的第一个数字提取到新数据帧(df1)

来自分类Dev

如何将列中的所有值替换为该列行中的第一个值?

来自分类Dev

如何基于一个数据帧的行值是一个子字符串/包含在另一个数据帧的行值中来联接两个数据帧?

来自分类Dev

基于 Python 中另一个数据帧的行值从数据帧中获取列?

来自分类Dev

如何为第一个数据帧中匹配的特定列值的所有值获取第二个数据帧的数据?

Related 相关文章

  1. 1

    如何将行值保留到另一个数据帧的第n个行值

  2. 2

    如何将列中的 NULL 值交换为最后一个非 NULL 值?

  3. 3

    如何将一个数据帧中某些列的值与另一数据帧中同一列集的值进行比较?

  4. 4

    如何将一个数据帧的值与另一个数据帧中的值进行比较?

  5. 5

    如何将列转换为以另一个数字列中的值为条件的和?

  6. 6

    如何将数据帧列的所有元素与另一个数据帧中为该列指定的值相乘?

  7. 7

    如何将一个数据帧的一行的EACH值与另一数据帧的一行的所有值相乘

  8. 8

    Python:如何在不删除重复项的情况下将一个数据帧中的列值替换为另一个

  9. 9

    根据另一个数据帧中的值将数据帧的列相乘

  10. 10

    当重复的行具有不同的值时,如何将重复的行合并为一个数据帧

  11. 11

    如何将一个数据帧中的一行的值与另一个数据帧中的多个行进行比较(包括计算)

  12. 12

    如何将一个数据框列直接转换为以列值作为列索引的数据框?

  13. 13

    如何将两个数据帧中的行合并为 R 中的一个数据帧?

  14. 14

    如何将一个数组中的值分配给另一个数组n次

  15. 15

    如何将 8 个数据帧组合成一个 GGplot(或任何东西)

  16. 16

    将值从一个数据帧替换为另一个

  17. 17

    在R中,如何将一个数据框中选定行中的值与另一数据框中选定列的值进行匹配?

  18. 18

    在R中,如何将一个数据框中选定行中的值与另一数据框中选定列的值进行匹配?

  19. 19

    将一个数据帧中的NA值替换为第二个数据帧中的值

  20. 20

    如果匹配另一个数据帧的 ID,则添加来自 n 个数据帧的值

  21. 21

    如何根据时间顺序和数据帧中重复的值分配一个从1到N开始的新列?

  22. 22

    从列中的另一个数据帧返回具有不同值的行

  23. 23

    如何成对地遍历大量数据帧并将值存储在一个 * n 矩阵中?

  24. 24

    将一个数据帧中的n行的子集绑定到多个其他数据帧中的不同n行的子集

  25. 25

    如何将数据帧(df)列的每个值的第一个数字提取到新数据帧(df1)

  26. 26

    如何将列中的所有值替换为该列行中的第一个值?

  27. 27

    如何基于一个数据帧的行值是一个子字符串/包含在另一个数据帧的行值中来联接两个数据帧?

  28. 28

    基于 Python 中另一个数据帧的行值从数据帧中获取列?

  29. 29

    如何为第一个数据帧中匹配的特定列值的所有值获取第二个数据帧的数据?

热门标签

归档