【发布时间】:2020-07-01 18:13:13
【问题描述】:
我有一个这样的数据库:
d <- c(01, 02, 03, 04)
h <- c("19:00", "19:00", "07:00", "07:00")
p1 <- c(123, 321, 123, 123)
p2 <- c(321, 345, 567, 567)
df <- data.frame(date = d, hours = h, person1 = p1, person2 = p2)
我使用这段代码将每个person1的所有特征关联到不同的列中:
已编辑:rn = rowid(person1, date, hours) 是实际代码。不是rn = rowid(person1)
library(dplyr)
library(data.table)
library(tidyr)
df1 <- df %>%
mutate(rn = rowid(person1, date, hours)) %>%
pivot_wider(names_from = rn, values_from = c(date, hours, person2),
names_sep="")
但是这段代码给了我这个输出:
# person1 date1 hours1 person21
# 123 c(1,3,4) c("19:00", "07:00", "07:00") c(321,567,567)
# 321 2 19:00 345
我不希望它重复像 07:00 或 567 这样的值。我希望它在不同的列中给我每个不同的值,忽略重复的值。如果可能的话,像这样组织:
# person1 date1 date2 date3 date4... hours1 hours2 ... person21 person22 person23 person24
# 123 01 NA 03 04 07:00 19:00 NA 321 NA 567
# 321 NA 02 NA NA NA 19:00 NA NA 345 NA
person21、22、23 和 24 分别是我的df1$person1 的第一、二、三、四等人。
但对我来说理想的输出应该是这样的:
# person1 d01 d02 d03 d04 ... h07:00 h19:00 ... p123 p321 p345 p567
# 123 1 0 1 1 ... 1 0 ... 1 0 0 1
# 321 0 1 0 0 ... 0 0 ... 1 0 0 1
我该怎么做?
【问题讨论】:
-
代码没有给我一个列表
-
@akrun 我现在以正确的方式编辑它。正确的代码实际上是您在旧帖子中给我的第二个建议。
-
在最后一个代码块中,您提到了
ideal output。我试图在下面的解决方案中获得该输出 -
啊,好的。代码几乎是我想要的。我只是希望它不注册重复的值。正如您在我昨天的帖子中所建议的那样,您可以使用我在
mutate(rn = rowid(person1, date, hours))而不是mutate(rn = rowid(person1))中编辑的代码更好地了解正在发生的事情。它给了我那些c("19:00", "07:00", "07:00")c(321,567,567)列表。 -
我更新了下面的解决方案。它看起来像您的预期输出
标签: r dataframe dplyr data-manipulation