在R语言数据框中合并列并格式化输出至Word的实现方法
问题描述
我有一个包含4列的数据框,列名分别为or、p、ll、ul,具体数据如下:
(Intercept) 0.007 <0.001 0.004 0.011 agecat35-54 1.266 0.017 1.043 1.537 agecat55-69 1.761 <0.001 1.432 2.166 agecat70-84 3.097 <0.001 2.467 3.888 agecat85+ 4.229 <0.001 3.307 5.408 female_1 0.766 <0.001 0.684 0.857
希望将最后两列ll和ul合并为% 95 CI列,格式为(ll值, ul值),最终输出可直接复制粘贴至Word,理想效果如下:
or p % 95 CI (Intercept) 0.007 <0.001 (0.004, 0.011) agecat35-54 1.266 0.017 (1.043, 1.537) agecat55-69 1.761 <0.001 (1.432, 2.166) agecat70-84 3.097 <0.001 (2.467, 3.888) agecat85+ 4.229 <0.001 (3.307, 5.408) female_1 0.766 <0.001 (0.684, 0.857)
解决方案
我给你准备了两种常用工具的实现方法,选你熟悉的用就行:
用Python(Pandas)实现
Pandas是处理表格数据的利器,几行代码就能搞定:
- 首先构造数据框,然后合并
ll和ul列,最后输出或直接复制到剪贴板:
import pandas as pd # 把你的数据转换成DataFrame data = { 'or': [0.007, 1.266, 1.761, 3.097, 4.229, 0.766], 'p': ['<0.001', '0.017', '<0.001', '<0.001', '<0.001', '<0.001'], 'll': [0.004, 1.043, 1.432, 2.467, 3.307, 0.684], 'ul': [0.011, 1.537, 2.166, 3.888, 5.408, 0.857] } # 设置行索引 row_names = ['(Intercept)', 'agecat35-54', 'agecat55-69', 'agecat70-84', 'agecat85+', 'female_1'] df = pd.DataFrame(data, index=row_names) # 合并ll和ul成% 95 CI列,格式为(值, 值) df['% 95 CI'] = df.apply(lambda row: f"({row['ll']}, {row['ul']})", axis=1) # 只保留需要的列 result_df = df[['or', 'p', '% 95 CI']] # 方法1:打印结果,直接复制输出的内容到Word print(result_df.to_string()) # 方法2:直接复制到剪贴板,打开Word粘贴就是规整的表格 result_df.to_clipboard(sep='\t', index=True)
运行后,要么复制打印的文本,要么直接粘贴剪贴板里的内容,就能得到你想要的格式啦。
用R实现
如果你习惯用R处理统计数据,这个方法也很简单:
# 构造数据框 data <- data.frame( or = c(0.007, 1.266, 1.761, 3.097, 4.229, 0.766), p = c("<0.001", "0.017", "<0.001", "<0.001", "<0.001", "<0.001"), ll = c(0.004, 1.043, 1.432, 2.467, 3.307, 0.684), ul = c(0.011, 1.537, 2.166, 3.888, 5.408, 0.857), row.names = c("(Intercept)", "agecat35-54", "agecat55-69", "agecat70-84", "agecat85+", "female_1") ) # 合并ll和ul列,生成% 95 CI data$`% 95 CI` <- paste0("(", data$ll, ", ", data$ul, ")") # 筛选需要的列 result_df <- data[, c("or", "p", "% 95 CI")] # 方法1:打印结果,复制输出内容到Word print(result_df) # 方法2:直接复制到剪贴板,粘贴到Word就是表格 write.table(result_df, "clipboard", sep="\t", row.names=TRUE, col.names=TRUE)
执行后,用第二种方法直接粘贴到Word,格式会非常规整,不用再手动调整。
内容的提问来源于stack exchange,提问作者mandy




