将Excel公式转换为R函数:基于列前值生成新列V2的问题
Hey there! Let's work through translating that Excel formula into R code, since you mentioned hitting a wall with cumulative multiplication approaches. First, let's clarify the logic from your formula, then cover both the exact interpretation of your Excel rule and a more likely cumulative scenario (since your mention of cumulative methods hints you might have intended that).
Exact Interpretation of Your Excel Formula
You stated the V2 column uses =IF(A2="",1,B1*(1+A2)) when filled down. For a table with columns Year (A), V1 (B), V2 (C), this means:
- For each row
i(starting at Excel row 2, which maps to R row 1 if your data starts at Excel row 2):- V2 equals
1if the Year value in that row is empty - Otherwise, multiply the previous row's V1 value by
(1 + current row's Year value)
- V2 equals
R Code for This Logic
Let's use sample data to test this out:
# Sample data matching your Excel structure df <- data.frame( Year = c("", 0.1, 0.2, "", 0.05), V1 = c(5, 6, 7, 8, 9), stringsAsFactors = FALSE ) # Initialize the V2 column df$V2 <- NA # Calculate V2 row by row for (i in seq_along(df$Year)) { if (df$Year[i] == "") { df$V2[i] <- 1 } else { # Handle the first row (no prior V1 to reference) if (i == 1) { # Use the current row's V1 as the starting point (adjust if your Excel uses a different initial value) df$V2[i] <- as.numeric(df$V1[i]) * (1 + as.numeric(df$Year[i])) } else { df$V2[i] <- as.numeric(df$V1[i-1]) * (1 + as.numeric(df$Year[i])) } } } # View the final result df
Likely Cumulative Logic (If Your Formula Had a Typo)
You mentioned trying cumulative multiplication, which suggests your Excel formula might have intended to reference the previous row's V2 instead of V1. That would make the formula =IF(A2="",1,C1*(1+A2)) (C is the V2 column)—a cumulative product that resets to 1 whenever Year is empty. This is a common pattern, so let's cover this too.
R Code for Cumulative Resetting Multiplication
We can use either a tidyverse approach with purrr or base R:
Tidyverse (purrr) Approach
library(purrr) df <- data.frame( Year = c("", 0.1, 0.2, "", 0.05), V1 = c(5, 6, 7, 8, 9), # V1 is hardcoded, unused here for cumulative logic stringsAsFactors = FALSE ) # Convert empty Year values to NA for easier handling df$Year_num <- as.numeric(df$Year) # Calculate V2: start with 1, reset to 1 if Year is NA, else multiply previous V2 by (1+Year) df$V2 <- accumulate(df$Year_num, .init = 1, ~ ifelse(is.na(.y), 1, .x * (1 + .y)))[-1] # View the result df
Base R Approach
df$Year_num <- as.numeric(df$Year) df$V2 <- NA # Set initial value for first row df$V2[1] <- ifelse(is.na(df$Year_num[1]), 1, 1 * (1 + df$Year_num[1])) # Fill down the rest of the column for (i in 2:nrow(df)) { if (is.na(df$Year_num[i])) { df$V2[i] <- 1 } else { df$V2[i] <- df$V2[i-1] * (1 + df$Year_num[i]) } } df
Quick Notes
- Empty strings in the Year column convert to
NAwhen cast to numeric, which is much easier to work with in R than raw empty strings. - If your original Excel formula truly references the prior row's V1, stick with the first method. If you meant to build a cumulative product that resets, the second approach is what you need.
内容的提问来源于stack exchange,提问作者rw2

