您好,我有一个数据框,例如
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 +
这是一个想法,对于每一行,如果符号为-
,则执行:
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
感谢您的帮助
答案 0 :(得分:3)
在这里,我们可以使用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))
答案 1 :(得分:2)
这是基本的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))
答案 2 :(得分:1)
以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