R的新手在这里。我正在尝试执行以下操作:
我有一个数据集,我们称它为dataset1,我想制作一个新的数据框(dataset2)。在数据集1中是人们的名字,然后是人们所处的状态(因此,存在重复的状态,但没有重复的名称/状态组合)。每个州列出的人数不超过3人。在数据集2中,我希望创建与每个州相关联的名为person1,person2,person3的新列(即:每个州只有一行)。因此,如果Alice,Bob和Cathy来自阿拉巴马州,然后Dave和Edwin来自阿拉斯加,则应该有两行:一列代表阿拉巴马州,一列代表阿拉斯加,然后person1 .... person3将在其中包含其名称。 (而阿拉斯加的最后一列p3将为空)。
我正在尝试将状态名称存储为虚拟变量,然后使用if语句对dataset1的行进行排序,然后根据需要追加数据集。不过,有些东西告诉我,与使用for / if语句相反,还有一种更简洁的方法。
有帮助吗?
答案 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 "" ""