我有一个包含患者和预约信息的数据框。每位患者可能已经参加过多次预约。在每次预约时收集一些患者信息,结果是一些患者信息相互冲突而一些患者信息丢失。
我想根据其他约会记录的数据填写缺少的患者预约信息。并且(这是我被困的地方)我想采取最低限度的'对于同一患者的信息存在冲突的因素,记录水平(最早按水平排列)。 (在下面的示例中,因子级别按字母顺序排列,但情况并非如此)。
这类似于this question,但我使用的是因子而不是字符,而且我有多个因素我想要最小值,所以不能按行过滤。
例如。我有
df.have <- data.frame(
grp_id = rep(1:3, each = 2),
grpvar1 = factor(c("B", "A", "B", "C", NA, "A")),
grpvar2 = factor(c("a", "b", "c", NA, NA, "x")),
appt_id = 1:6)
我想要
grp_id grpvar1 grpvar2 appt_id
1 A a 1
1 A a 2
2 B c 3
2 B c 4
3 A x 5
3 A x 6
或至少
grp_id grpvar1 grpvar1.1
1 A a
2 B c
3 A x
答案 0 :(得分:1)
我们可以尝试使用scanf(" %c", &again)
^ a space here
scanf("\n%c", &again)
Or remove \n from printf because you might not want cursor to go to next line
。因为我们需要第一个summarise_each
&#39; grpvar&#39;在我们这样做之前,我们需要确保丢弃未使用的级别(使用level
)。
droplevels
或者,如果我们使用df.have %>%
group_by(grp_id) %>%
summarise_each(funs(first(levels(droplevels(.)))), grpvar1:grpvar2)
# grp_id grpvar1 grpvar2
# <int> <chr> <chr>
#1 1 A a
#2 2 B c
#3 3 A x
,我们会得到第一个输出
mutate_each
如果我们需要输出为df.have %>%
group_by(grp_id) %>%
mutate_each(funs(levels(droplevels(.))[1]), grpvar1:grpvar2)
# grp_id grpvar1 grpvar2 appt_id
# <int> <chr> <chr> <int>
#1 1 A a 1
#2 1 A a 2
#3 2 B c 3
#4 2 B c 4
#5 3 A x 5
#6 3 A x 6
列的&#39; grpvar&#39; s。
factor
或使用 df.have %>%
group_by(grp_id) %>%
mutate_each(funs(factor(levels(droplevels(.))[1])), grpvar1:grpvar2)
# grp_id grpvar1 grpvar2 appt_id
# <int> <fctr> <fctr> <int>
#1 1 A a 1
#2 1 A a 2
#3 2 B c 3
#4 2 B c 4
#5 3 A x 5
#6 3 A x 6
data.table