在R中,我有一个数据帧(mydf),如下所示:

weight Q1 Q2
100 1 0
200 0 1
250 NA 1
387 1 0

(但有100列(全部为二进制Q3、Q4等)和2000行).

我正在try 编写一个循环,这样我就可以获得每列中每个二进制值的权重总和.

因此,例如,我希望输出如下所示:

Q1 Q1.weight Q2 Q2.weight
1 487 1 450
0 200 0 487

我已经写了一个循环来完成这个任务,它将结果保存到一个空的嵌套框(empty_df)中.它写道:

questions <- c("Q1", "Q2")
for (i in questions) {
empty_df[[paste0(i, "")]] <- aggregate(weight ~ mydf[[paste0(i, "")]], data = mydf, FUN = sum)
  }

这会生成正确的值,但会给出奇怪的列名.它给我的输出是:

Q1$mydf[[paste0(i, "")]] Q1$weight Q2$mydf[[paste0(i, "")]] Q2$weight
1 487 1 450
0 200 0 487

我try 了一系列不同的方法来正确命名列,并try 使用gSub删除$"mydf[[paste0(i, "")]]",但似乎都不起作用.

任何关于如何用正确的列创建输出的 idea 都将不胜感激--预先感谢您的帮助!

推荐答案

如果你愿意改用一种整齐的方法,试试这个:

library(dplyr)
library(tidyr) # pivot_*
mydf %>%
  pivot_longer(cols = -weight, names_to = "Q") %>%
  summarize(weight = sum(weight), .by = c(Q, value)) %>%
  mutate(rn = match(value, sort(unique(value))), .by = Q) %>%
  filter(!is.na(value)) %>%
  pivot_wider(id_cols = rn, names_from = "Q", values_from = c("value", "weight"), names_glue = "{Q}.{.value}") %>%
  select(-rn) %>%
  select(order(colnames(.)))
# # A tibble: 2 × 4
#   Q1.value Q1.weight Q2.value Q2.weight
#      <int>     <int>    <int>     <int>
# 1        1       487        1       450
# 2        0       200        0       487

R相关问答推荐

检测(并替换)字符串中的数学符号

根据收件箱中的特定值提取列名

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

咕噜中的元素列表:map

从R导出全局环境中的所有sf(numrames)对象

使用ggsankey调整Sankey图中单个 node 上的标签

将数字转换为分钟和秒

使用列/行匹配将两个不同维度的矩阵相加

提取一个列表中单个列的重复观察结果R

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

为左表中的所有行使用值Fill滚动左连接

如何使用字符串从重复的模式中提取多个数字?

解析嵌套程度极高的地理数据

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

如何构建一个for循环来循环处理动物ID?

将R中对象的CSV数组转换为JSON数组

如何使用ggsurvfit包更改风险表中的标签名称?

R data.设置函数&;连接中的列值而不使用for循环的表方法?