我有一个数据框,在所有参与者中,一个唯一的主体ID会重复两次。接下来的数据似乎由一列组成,在其中一个条目的值为NA,在另一个条目中存在一个值(尽管这不确定,我使用的方法应该考虑到这种可能性不存在)。
以下是一个示例:
Name <- c("Jon", "Jon", "Maria", "Maria", "Tina", "Tina", "dan", 'dan', 'wen', 'wen')
a <- c(1, 1, 2, 2, 3, 4, 4, 4, 5, 6)
b <- c(NA, 1, NA, 2, NA, 3, NA, 4, NA, 5)
c <- c(1, NA, 2, NA, 3, NA, 4, NA, 5, NA)
df <- data.frame(Name, a, b, c)
到目前为止,我想到的解决方案是循环遍历所有唯一的ID(在上面的例子中是名称),并为每个条目创建单独的数据框。类似于这样:
#Instantiate list of lists that will become dfs
firstdf <- c()
seconddf <- c()
#Loop through existing df by unique ID (Name) and create
# list containing values of 1 entry and list of the other
for (i in unique(df$Name)) {
innerlist1 <- c()
innerlist2 <- c()
for (x in c(1:length(df[df['Name'] == i]))) {
if (x%%2 == 1) {
# Takes one set of entries per ID
innerlist1 <- c(innerlist1, df[df['Name'] == i][x])
} else if (x%%2 == 0) {
# Takes other set of entries per ID
innerlist2 <- c(innerlist2, df[df['Name'] == i][x])
}
}
firstdf <- c(firstdf, list(innerlist1))
seconddf <- c(seconddf, list(innerlist2))
}
# Make dfs from lists
firstdf <- do.call(rbind.data.frame, firstdf)
names(firstdf) <- names(df)
seconddf <- do.call(rbind.data.frame, seconddf)
names(seconddf) <- names(df)
我会使用类似于合并的方法,通过by="Name"
将dfs组合起来。
我的原始数据集很大,这种方法不是特别高效或优雅。有没有人能提出改进意见?
mean
或paste
的值来替换first
- Clemsang