R /添加到数据帧中的Tricky for循环

时间:2018-10-10 23:57:20

标签: r for-loop statistics

R的新手在这里。我正在尝试执行以下操作:

我有一个数据集,我们称它为dataset1,我想制作一个新的数据框(dataset2)。在数据集1中是人们的名字,然后是人们所处的状态(因此,存在重复的状态,但没有重复的名称/状态组合)。每个州列出的人数不超过3人。在数据集2中,我希望创建与每个州相关联的名为person1,person2,person3的新列(即:每个州只有一行)。因此,如果Alice,Bob和Cathy来自阿拉巴马州,然后Dave和Edwin来自阿拉斯加,则应该有两行:一列代表阿拉巴马州,一列代表阿拉斯加,然后person1 .... person3将在其中包含其名称。 (而阿拉斯加的最后一列p3将为空)。

我正在尝试将状态名称存储为虚拟变量,然后使用if语句对dataset1的行进行排序,然后根据需要追加数据集。不过,有些东西告诉我,与使用for / if语句相反,还有一种更简洁的方法。

有帮助吗?

1 个答案:

答案 0 :(得分:1)

听起来您需要将数据从长格式转换为宽格式。

这里有一些虚假数据:

set.seed(42)
df <- data.frame(stringsAsFactors = F,
  states = sample(state.name, size = 100, replace = T),
  people = sample(LETTERS, size = 100, replace = T)
  )

这是一种按状态分组,标记它们是Person1还是Person2等的方法,然后将其分布到列中

library(tidyr); library(dplyr)
df2 <- df %>%
  group_by(states) %>%
  mutate(person = paste0("Person", row_number())) %>%
  ungroup() %>%
  spread(person, people, fill = "")

输出:

> df2
# A tibble: 44 x 6
   states   Person1 Person2 Person3 Person4 Person5
   <chr>    <chr>   <chr>   <chr>   <chr>   <chr>  
 1 Alabama  Q       R       P       P       K      
 2 Alaska   R       M       K       L       C      
 3 Arkansas O       ""      ""      ""      ""     
 4 Colorado X       U       F       ""      ""     
 5 Delaware O       ""      ""      ""      ""     
 6 Georgia  L       N       V       O       ""     
 7 Hawaii   G       ""      ""      ""      ""     
 8 Idaho    W       L       J       C       ""     
 9 Illinois V       ""      ""      ""      ""     
10 Indiana  Y       Y       U       ""      ""