我有一个宽格式的数据框,其中包含变量名,例如"per601.199003"
(它们都以"per"
开头,后跟3-4位数字,句号.
和一个表示特定日期的数字。
现在,对于每对"per601..."
和"per602..."
变量,我都需要从前一个变量"per601..." - "per602..."
中减去后者。
有些匹配的结尾(例如"per601.199003"
和"per602.199003"
),但也有其他结尾,我只有"per601..."
-或"per602..."
-version。< / p>
为了便于复制,也为了简单起见,假设这是我的两个变量名列表(我使用grep()
获得了它们)。实际上,两个列表显然更长。
vars_601 <- c("per601.199003", "per601.200201", "per601.2001409")
vars_602 <- c("per602.199003", "per602.200201", "per602.2001702")
现在我需要的是这样的东西:
for (i in per_601_list) {
#search corresponding item in per_602_list (i.e. same ending)
#subtract this latter item from the first item
}
答案 0 :(得分:1)
我不知道您的per_60x_list
应该是什么,所以让我只使用列名的字符向量:
vars_601 <- c("per601.199003", "per601.200201", "per601.2001409")
vars_602 <- c("per602.199003", "per602.200201", "per602.2001702")
我需要一些示例数据来使用,因此,我将使用以下名称构造一个名为df
的数据框:
df <- as.data.frame(matrix(sample(1:100, 60, T), 10, 6))
names(df) <- c(vars_601, vars_602)
现在开始循环。我们首先使用grep
检查每个601列是否有对应的602列,如果是,我们使用df[paste()]
减去并分配一个新变量:
for(i in seq_along(vars_601)) {
# get the i'th 601 date
thisdate <- substr(vars_601[i], 8, nchar(vars_601[i]))
# check if there is a matching 602 date
ismatch <- sum(grepl(paste0("*", thisdate), vars_602)) > 0
# if there's a match, subtract: diff.date = 601.date - 602.date
if(ismatch) {
df[paste0("diff.", thisdate)] <- df[paste0("per601.", thisdate)] -
df[paste0("per602.", thisdate)]
}
}
或者,不循环,只需在一个数据帧中获得匹配的601 cols,在另一个数据帧中获得匹配的602 cols,然后(确保cols顺序正确后)减去两个数据帧:
var_601_dates <- substr(vars_601, 8, 14)
var_602_dates <- substr(vars_602, 8, 14)
df[ , sort(vars_601[var_601_dates %in% var_602_dates])] -
df[ , sort(vars_602[var_602_dates %in% var_601_dates])]