如何在R中提取特定单元格值计算并生成指定格式CSV文件?
解决方法:生成目标CSV的简便R代码
首先,我先帮你指出原代码里的几个小问题,这样你以后也能避免:
- 管道操作符
%>%没有连贯使用,select之后直接接filter会报错,每一步都要用%>%连接 mutate的语法不对,不需要重复写数据框名,而且diff的顺序可能不符合你的需求(你需要的是Worse减Better,不是默认的后减前)- 原数据里的列名有空格(比如
Unweighted Base),需要用反引号`包裹,或者先重命名成无空格的名字 - 百分比值带
%符号,需要先提取纯数字再计算
下面是针对你的需求的简化代码,适合新手理解和使用:
步骤1:加载必要的包
library(tidyverse) # 包含dplyr和字符串处理工具,不用单独加载dplyr了
步骤2:处理数据并生成输出
假设你的原始数据框名为df,先确认数据结构(可以用glimpse(df)查看),然后执行以下代码:
# 1. 提取Net: Better和Net: Worse的百分比数值,计算差值 net_balance <- df %>% filter(Total %in% c("Net: Better", "Net: Worse")) %>% mutate(pct = as.numeric(str_remove(`Unweighted Base`, "%"))) %>% # 去掉%转成数值 summarise(balance = pct[Total == "Net: Worse"] - pct[Total == "Net: Better"]) %>% pull(balance) # 2. 提取Total列前两行的内容(Unweighted Base和Base) base_details <- df %>% slice(1:2) %>% mutate(detail = str_c(Total, " ", `Unweighted Base`)) %>% pull(detail) # 3. 构造最终输出的数据框 output_df <- tibble( `Q1_Grid` = first(df$Q1_Grid), # 取Q1_Grid列的第一个值(假设所有行都是同一个问题) !!!set_names(base_details, base_details), # 把Base相关内容作为列名和值 `Net: Balance` = str_c(net_balance, "%") # 拼接百分比符号 ) # 4. 导出为CSV文件 write_csv(output_df, "survey_output.csv")
代码说明
str_remove(Unweighted Base, "%"):去掉百分比列里的%符号,方便转成数值计算slice(1:2):直接取数据框的前两行(对应你需要的Unweighted Base和Base)first(df$Q1_Grid):假设所有行的Q1_Grid都是同一个问题名,取第一个值即可write_csv:导出成CSV文件,你可以修改文件名和路径
测试示例
用你提供的示例数据,这段代码会生成你想要的输出:
Q1_Grid,Unweighted Base 10000,Base 10000,Net: Balance Q1_Grid,Unweighted Base 10000,Base 10000,3%
内容的提问来源于stack exchange,提问作者Saravanan Kalyani Sarasu
相关产品推荐
相关产品推荐

