在R中的标头上运行forloop

在R中的标头上运行forloop,r,R,我正在尝试从stata切换到R,需要forloop的帮助 背景: 我有数据(调查问卷),有5个模块,每个模块有10个问题。这里有一个想法。将数据框拆分为问题列表,并映射到列表中的每个元素 示例数据:三个模块和两个问题 df <- data.frame(B1B1 = c(1,2, rep(NA, 4)), B1B2 = c(3,4, rep(NA, 4)), B2B1 = c(NA,NA,5,6,NA,NA),

我正在尝试从stata切换到R,需要forloop的帮助

背景:


我有数据(调查问卷),有5个模块,每个模块有10个问题。这里有一个想法。将数据框拆分为问题列表,并映射到列表中的每个元素

示例数据:三个模块和两个问题

df <- data.frame(B1B1 = c(1,2, rep(NA, 4)),
                 B1B2 = c(3,4, rep(NA, 4)),
                 B2B1 = c(NA,NA,5,6,NA,NA),
                 B2B2 = c(NA,NA,7,8,NA,NA),
                 B3B1 = c(rep(NA,4), 1,2),
                 B3B2 = c(rep(NA,4), 3,4))


B1B1 B1B2 B2B1 B2B2 B3B1 B3B2
1    1    3   NA   NA   NA   NA
2    2    4   NA   NA   NA   NA
3   NA   NA    5    7   NA   NA
4   NA   NA    6    8   NA   NA
5   NA   NA   NA   NA    1    3
6   NA   NA   NA   NA    2    4

结果:

library(tidyverse) 

split.default(df, str_extract(names(df), "..$")) %>%
  map_df(~ coalesce(!!! .x))
# A tibble: 6 x 2
     B1    B2
  <dbl> <dbl>
1     1     3
2     2     4
3     5     7
4     6     8
5     1     3
6     2     4
#一个tible:6x2
B1 B2
1     1     3
2     2     4
3     5     7
4     6     8
5     1     3
6     2     4

你说的块是什么意思?您可以添加数据(使用
?dput
函数)并指定您要实现的格式吗?我所说的块只是指将其拆分为不同的变量。我想我的措辞很糟糕,但是我的数据被分成了5个变量,我试图用ifelse语句将它们组合成1个,我需要在10个集合上循环,所以你有5个数据帧(命名为“b1b1b1”、…、“B5B1”),每个数据帧有10列(每个数据帧/I分别命名为“BiB1”、…、“BiB10”),你想按行连接它们吗?它们都在同一个df中。只是DF中的不同列,我试图将它们合并为1。他们混合了数据和NA(其他变量都有数据)B1B1 1 NA 2 NA 3 NA 4 NA 5 NA 6 NA 7 NA 8 NA 9 NA 10 2 B2B1 2 1 3 NA 4 NA 5 2 6 NA 7 2你能编辑帖子并包含你的数据吗?复制并粘贴来自
dput(df)
的输出,其中
df
是您的数据帧。
 forvalues i=1(1)10{

   gen b`i'=B1B`i' if B1B`i' != .

   replace b`i'=B2B`i' if B2B`i' != .

   replace b`i'=B3B`i' if B3B`i' != .

   replace b`i'=B4B`i' if B4B`i' != .

   replace b`i'=B5B`i' if B5B`i' != .

  }
df <- data.frame(B1B1 = c(1,2, rep(NA, 4)),
                 B1B2 = c(3,4, rep(NA, 4)),
                 B2B1 = c(NA,NA,5,6,NA,NA),
                 B2B2 = c(NA,NA,7,8,NA,NA),
                 B3B1 = c(rep(NA,4), 1,2),
                 B3B2 = c(rep(NA,4), 3,4))


B1B1 B1B2 B2B1 B2B2 B3B1 B3B2
1    1    3   NA   NA   NA   NA
2    2    4   NA   NA   NA   NA
3   NA   NA    5    7   NA   NA
4   NA   NA    6    8   NA   NA
5   NA   NA   NA   NA    1    3
6   NA   NA   NA   NA    2    4

library(tidyverse) 

split.default(df, str_extract(names(df), "..$")) %>%
  map_df(~ coalesce(!!! .x))
# A tibble: 6 x 2
     B1    B2
  <dbl> <dbl>
1     1     3
2     2     4
3     5     7
4     6     8
5     1     3
6     2     4