R语言中按列名匹配两个DataFrame对应元素相乘时出现NA及非数值参数错误的问题
R语言中按列名匹配两个DataFrame对应元素相乘时出现NA及非数值参数错误的问题
看起来你是想让df1里的每个变量列,都乘以df2中对应列的OIS值对吧?遇到NA和非数值参数的错误,我帮你梳理下可能的原因和解决办法:
先排查错误根源
- 非数值参数错误:这个大概率是因为df2中OIS那一行的对应列不是数值类型——比如可能是字符格式,没法和df1的数值列做乘法运算。
- 出现NA:要么是你用索引
i匹配列的时候,df1和df2的列名没对齐(比如df1的第i列和df2的第i列名字不一样),导致取错了值;要么是转数值时遇到了无法转换的字符,结果变成了NA。
修正后的解决方案
方案一:用循环(更直观,适合理解)
# 先定位OIS所在的行 ois_row <- which(df2[, 1] == "OIS") # 先把df2中OIS行的变量列转成数值型(解决非数值参数问题) df2[ois_row, -1] <- lapply(df2[ois_row, -1], as.numeric) # 先确认两个数据框的变量列名完全匹配,避免取错列 stopifnot(all(colnames(df1)[-1] == colnames(df2)[-1])) # 按列名循环匹配相乘,而不是用索引i(避免列名不对齐的问题) for (col_name in colnames(df1)[-1]) { df1[[col_name]] <- df1[[col_name]] * df2[ois_row, col_name] }
方案二:向量化操作(更高效,R的惯用写法)
如果数据量较大,循环效率不高,推荐用向量化的方式处理:
# 提取df2中OIS行的数值,严格按df1的变量列名匹配 ois_values <- df2[df2[,1] == "OIS", colnames(df1)[-1], drop = FALSE] # 确保是数值向量 ois_values <- as.numeric(ois_values) # 直接对df1的所有变量列做广播相乘,保留第一列的ID df1[, -1] <- df1[, -1] * ois_values
额外检查建议
- 可以先运行
str(df2[ois_row, ])看看OIS行的变量列类型,如果是chr(字符)就一定要转成数值。 - 运行
all(colnames(df1)[-1] == colnames(df2)[-1])确认列名完全一致,要是返回FALSE,就得先对齐两个数据框的列名再操作。
备注:内容来源于stack exchange,提问作者Fullcupofstats
相关产品推荐
相关产品推荐

