R - 如果满足条件,则减去不同的列

时间:2018-02-06 23:55:17

标签: r dataframe

我有一个巨大的数据框,如:

df = data.frame(A = c(1,54,23,2), B=c(1,2,4,65), C=c("+","-","-","+"))

> df
   A  B C
1  1  1 +
2 54  2 -
3 23  4 -
4  2 65 +

我需要根据不同的条件减去行,并将这些结果添加到新列中:

 A - B if C == +
 B - A if C == -

所以,我的输出是:

> new_df
   A  B C   D
1  1  1 +   0
2 54  2 - -52
3 23  4 - -19
4  2 65 + -63

6 个答案:

答案 0 :(得分:2)

这假设只有两个条件+-位于C列中。

df$D <- with(df, ifelse(C %in% "+", A - B, B - A))
df
#    A  B C   D
# 1  1  1 +   0
# 2 54  2 - -52
# 3 23  4 - -19
# 4  2 65 + -63

答案 1 :(得分:1)

最好在创建数据框时添加stringsAsFactors = FALSE。此外,我不想将df用于变量名称,因为有df()函数:

df1 <- data.frame(A = c(1, 54, 23, 2), 
                  B = c(1, 2, 4, 65), 
                  C = c("+", "-", "-", "+"), 
                  stringsAsFactors = FALSE)

假设C仅为+-,您可以使用dplyr::mutate()并使用ifelse()进行测试:

library(dplyr)
df1 %>% 
  mutate(D = ifelse(C == "+", A - B, B - A))

答案 2 :(得分:0)

或者,如果您想评估C列中的算术信息(如加法或减法),您可以使用eval(parse(txt))(更多关于此处的内容:Evaluate expression given as a string)。

## Transforming into a matrix (simplifies everything into characters)
df_mat <- as.matrix(df)

## Function for evaluation the rows
eval.row <- function(row) {
    eval(parse(text= paste(row[1], row[3], row[2])))
}

## For the first row
eval.row(df_mat[1,])
# [1] 2

## For the whole data frame
apply(df_mat, 1, eval.row)
# [1]  2 52 19 67

## Updating the data.frame
df$D <- apply(df_mat, 1, eval.row)

答案 3 :(得分:0)

使用dplyr

如果C列中肯定只有+-,您可以这样做:

library(dplyr)

df2 <- df %>%
     mutate(D = ifelse(C == '+', A - B, B - A))

我一般会这样做:

df2 <- df %>%
     mutate(D = ifelse(C == '+', A - B,
                ifelse(C == '-', B - A, NA)))

以防有些内容没有+-

答案 4 :(得分:0)

这个答案对你有用 https://stackoverflow.com/a/19000310/6395612

您可以像这样使用:

df['D'] = with(df, ifelse(C=='+', A - B, B - A))

答案 5 :(得分:0)

基础解决方案:

df$D = (df$B-df$A)*sign((df$C=="-")-0.5)
#    A  B C   D
# 1  1  1 +   0
# 2 54  2 - -52
# 3 23  4 - -19
# 4  2 65 + -63

也可以写成df <- transform(df, D = (B-A)*sign((C=="-")-0.5))