我有一个巨大的数据框,如:
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
答案 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))