簡體   English   中英

R:如何在有條件的數據框中交換值?

[英]R: How to swap values in a data frame with condition?

我的數據集分別有來自父母和孩子的 2 個 ID,但我不知道誰是誰。 但是我有他們的年齡這是我正在使用的表格:

ID1 ID2 sex1 sex2 age1 age2
1   8   9    1    2   44   11
2  17   7    1    1   56   76
3   1  44   NA   NA   16   55
4   3  13   NA   NA   NA   NA
5  55   6    2   NA   56   10
6   4  33    2   NA   45   9
7   2  66    1   NA   12   45
8  72  99   NA   NA   NA   NA
9  12  11    2    2   30   12

通過使用if語句,我想根據年齡確定誰是誰。 這是我制作的代碼,但它不起作用:

install.packages('seqinr')
library(seqinr)

for (i in 1:nrow(data)){
  if (data$age2[i]> data$age1[i]){
    swap(data$age1[i], data$age2[i])
  }
}

錯誤信息:

Error in if (data$age2[i] > data$age1[i]) { : 
  missing value where TRUE/FALSE needed

我想把父母的年齡放在age1中,孩子的年齡放在age2中。 有人對如何做有更好的想法嗎?

歡迎來到 SO!
您可以在沒有任何 for 循環的情況下對其進行管理,以防您只需要將最高值放入age1中,將較低值放入age2中,按行比較兩列:

# I've put age_* to compare results with data, to replace, use age* in df$age*
df$age_1 <- pmax(df$age1, df$age2)
df$age_2 <- pmin(df$age1, df$age2)

結果:

  ID1 ID2 sex1 sex2 age1 age2 age_1 age_2
1   8   9    1    2   44   11    44    11
2  17   7    1    1   56   76    76    56
3   1  44   NA   NA   16   55    55    16
4   3  13   NA   NA   NA   NA    NA    NA
5  55   6    2   NA   56   10    56    10
6   4  33    2   NA   45    9    45     9
7   2  66    1   NA   12   45    45    12
8  72  99   NA   NA   NA   NA    NA    NA
9  12  11    2    2   30   12    30    12

有數據:

df <- read.table(text = 'ID1 ID2 sex1 sex2 age1 age2
1   8   9    1    2   44   11
2  17   7    1    1   56   76
3   1  44   NA   NA   16   55
4   3  13   NA   NA   NA   NA
5  55   6    2   NA   56   10
6   4  33    2   NA   45   9
7   2  66    1   NA   12   45
8  72  99   NA   NA   NA   NA
9  12  11    2    2   30   12', header = T)
library(tidyverse)

df <- read_table(
  "ID1 ID2 sex1 sex2 age1 age2
   8   9    1    2   44   11
  17   7    1    1   56   76
   1  44   NA   NA   16   55
   3  13   NA   NA   NA   NA
  55   6    2   NA   56   10
   4  33    2   NA   45   9
   2  66    1   NA   12   45
  72  99   NA   NA   NA   NA
  12  11    2    2   30   12"
)

方法一:

df %>%  
  transform(age1 = case_when(age1 > age2 ~ age1, 
                             TRUE ~ age2), 
            age2 = case_when(age2 > age1 ~ age2, 
                             TRUE ~ age1))

方法二:

df %>%  
  transform(age1 = pmax(age1, age2), 
            age2 = pmin(age1, age2))

  ID1 ID2 sex1 sex2 age1 age2
1   8   9    1    2   44   11
2  17   7    1    1   76   56
3   1  44   NA   NA   55   16
4   3  13   NA   NA   NA   NA
5  55   6    2   NA   56   10
6   4  33    2   NA   45    9
7   2  66    1   NA   45   12
8  72  99   NA   NA   NA   NA
9  12  11    2    2   30   12

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM