簡體   English   中英

如何根據 R 中的某些條件改變幾列

[英]How to mutate few columns depending on certain conditions in R

我有一個數據框'df',如下所示,

R0 <- c('A','B','C','D','E','F')
R1 <- c(15515.88,5156.04,65656,1566.1,11,56)
R2 <- c(515,5156.11,415,1455,47,335)
R3 <- c(123.14,9875,1247,778.04,1445,6645)
R4 <- c(115.88,56.04,6556,166,545,998)
R5 <- c('XX-XX',"AA-AA","VV-VV","YY-YY", 'XX-XX Component', 'YY-YY Component')
df <- data.frame(R0,R1,R2,R3,R4,R5)

如果 R5 的前 5 個字符是“XX-XX”或“YY-YY”,我需要將 R1 到 R4 乘以“-1”。 我做了下面的編碼也很好用,

library(operators) 
d1 <- df2[stringr::str_extract(df2$R5, "^.{5}") %in% c("XX-XX", "YY-YY"),]
d2 <- df2[stringr::str_extract(df2$R5, "^.{5}") %!in% c("XX-XX", "YY-YY"),]

d1[,2:5] <- d1[,2:5]*(-1)
dff <- rbind(d1,d2)

output 與“dff”中的預期一樣,但是有一種簡單的方法,而不是將數據幀分成兩個然后 rbind。

一個dplyr選項可以是:

df %>%
 mutate(across(R1:R4, ~ if_else(substr(R5, 1, 5) %in% c("XX-XX", "YY-YY"), . * -1, .)))

  R0        R1       R2       R3      R4              R5
1  A -15515.88  -515.00  -123.14 -115.88           XX-XX
2  B   5156.04  5156.11  9875.00   56.04           AA-AA
3  C  65656.00   415.00  1247.00 6556.00           VV-VV
4  D  -1566.10 -1455.00  -778.04 -166.00           YY-YY
5  E    -11.00   -47.00 -1445.00 -545.00 XX-XX Component
6  F    -56.00  -335.00 -6645.00 -998.00 YY-YY Component

在基礎 R 中,您可以使用:

df[2:5] <- df[2:5] * c(1, -1)[grepl('^(XX-XX|YY-YY)', df$R5) + 1]
df
#  R0        R1       R2       R3      R4              R5
#1  A -15515.88  -515.00  -123.14 -115.88           XX-XX
#2  B   5156.04  5156.11  9875.00   56.04           AA-AA
#3  C  65656.00   415.00  1247.00 6556.00           VV-VV
#4  D  -1566.10 -1455.00  -778.04 -166.00           YY-YY
#5  E    -11.00   -47.00 -1445.00 -545.00 XX-XX Component
#6  F    -56.00  -335.00 -6645.00 -998.00 YY-YY Component

如果R5XX-XXYY-YY開頭,我們乘以 -1。

暫無
暫無

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

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