根据另一列中的模式创建两个新列



你好,我有一个数据帧,比如

ColG Col2 Col3 Len    Sign
G1   1    30   300    +
G2   20   80   200    +
G3   455  720  1000   -
G4   3    40   100    -
G4   2    90   130    +

这是一个想法,对于每一行,如果Sign是-,那么执行:

Len-Col2 > NewCol3
Len-Col3 > NewCol2

示例

1000-720=280
1000-455=545
100-40=60
100-3=97

并得到:

ColG Col2 Col3 Len    Sign NewCol2  NewCol3
G1   1    30   300    +    1        30
G2   20   80   200    +    20       80
G3   455  720  1000   -    280      545
G4   3    40   100    -    60       97
G4   2    90   130    +    2        90

感谢您的帮助

在这里,我们可以使用case_when

library(dplyr)
df1 %>%
mutate(NewCol2 = case_when(Sign == '+' ~ Col2, TRUE ~ Len - Col3),
NewCol3 = case_when(Sign == '-' ~ Len - Col2, TRUE ~ Col3)
)

数据

df1 <- structure(list(ColG = c("G1", "G2", "G3", "G4", "G4"), Col2 = c(1L, 
20L, 455L, 3L, 2L), Col3 = c(30L, 80L, 720L, 40L, 90L), Len = c(300L, 
200L, 1000L, 100L, 130L), Sign = c("+", "+", "-", "-", "+")), 
class = "data.frame", row.names = c(NA, 
-5L))

这是一个基本的R解决方案

dfout <- within(df, New <- rev((Sign=="-")*(Len-cbind(Col2,Col3))) + (Sign=="+")*cbind(Col2,Col3))

它给出

> dfout
ColG Col2 Col3  Len Sign New.Col2 New.Col3
1   G1    1   30  300    +        1       30
2   G2   20   80  200    +       20       80
3   G3  455  720 1000    -      280      545
4   G4    3   40  100    -       60       97
5   G4    2   90  130    +        2       90

数据

df <- structure(list(ColG = c("G1", "G2", "G3", "G4", "G4"), Col2 = c(1L, 
20L, 455L, 3L, 2L), Col3 = c(30L, 80L, 720L, 40L, 90L), Len = c(300L, 
200L, 1000L, 100L, 130L), Sign = c("+", "+", "-", "-", "+")), class = "data.frame", row.names = c(NA, 
-5L))

一个基于R:的简单解决方案

假设您的数据帧称为df:


transform(df,
NewCol2 = ifelse(Sign == "-", Len-Col3, Col2),               
NewCol3 = ifelse(Sign == "-", Len-Col2, Col3)
)
# ColG Col2 Col3  Len Sign NewCol2 NewCol3
# 1   G1    1   30  300    +       1      30
# 2   G2   20   80  200    +      20      80
# 3   G3  455  720 1000    -     280     545
# 4   G4    3   40  100    -      60      97
# 5   G4    2   90  130    +       2      90

最新更新