我正在使用R来分析一个包含~100,000行的CSV文件。我很感激任何帮助 - 我真的很陌生。
这是我的表:
Row1 -> Group, Position, Frequency
Row2 -> 192, 1, 0.2
Row3 -> 192, 2, 0.3
Row4 -> 192, 3, 0.1
Row5 -> 193, 4, 0.5
Row6 -> 193, 5, 0.6
Row7 -> 194, 6, 0.2
Row8 -> 194, 7, 0.4
Row9 -> 195, 8, 0.9
Row10 -> 196, 9, 0.8
我希望组列中的每个值重复三次。 192次重复三次,但194次重复两次,而195次和196次只发生一次。我想添加行,这样如果组列中没有三个重复的值,它将添加行以使总共三次重复并将该行的其他列中的单元格留空(或{{1 }})。所以最终结果如下:
NA
答案 0 :(得分:2)
使用tidyverse,您可以使用tidyr::complete
添加缺少的行组合:
library(tidyverse)
df <- data_frame(Row = c("Row2", "Row3", "Row4", "Row5", "Row6", "Row7", "Row8", "Row9", "Row10"),
Group = c(192, 192, 192, 193, 193, 194, 194, 195, 196),
Position = 1:9,
Frequency = c(0.2, 0.3, 0.1, 0.5, 0.6, 0.2, 0.4, 0.9, 0.8))
df_filled <- df %>%
group_by(Group) %>%
mutate(i = row_number()) %>%
complete(i = 1:3)
df_filled
#> # A tibble: 15 x 5
#> # Groups: Group [5]
#> Group i Row Position Frequency
#> <dbl> <int> <chr> <int> <dbl>
#> 1 192 1 Row2 1 0.2
#> 2 192 2 Row3 2 0.3
#> 3 192 3 Row4 3 0.1
#> 4 193 1 Row5 4 0.5
#> 5 193 2 Row6 5 0.6
#> 6 193 3 <NA> NA NA
#> 7 194 1 Row7 6 0.2
#> 8 194 2 Row8 7 0.4
#> 9 194 3 <NA> NA NA
#> 10 195 1 Row9 8 0.9
#> 11 195 2 <NA> NA NA
#> 12 195 3 <NA> NA NA
#> 13 196 1 Row10 9 0.8
#> 14 196 2 <NA> NA NA
#> 15 196 3 <NA> NA NA
答案 1 :(得分:1)
do.call(rbind, lapply(split(df, df$Group), function(a){
data.frame(Group = rep(a$Group[1], 3),
Position= a$Position[1:3],
Frequency = a$Frequency[1:3])
}))
# Group Position Frequency
#192.1 192 1 0.2
#192.2 192 2 0.3
#192.3 192 3 0.1
#193.1 193 4 0.5
#193.2 193 5 0.6
#193.3 193 NA NA
#194.1 194 6 0.2
#194.2 194 7 0.4
#194.3 194 NA NA
#195.1 195 8 0.9
#195.2 195 NA NA
#195.3 195 NA NA
#196.1 196 9 0.8
#196.2 196 NA NA
#196.3 196 NA NA
DATA
df = structure(list(Group = c(192L, 192L, 192L, 193L, 193L, 194L,
194L, 195L, 196L), Position = 1:9, Frequency = c(0.2, 0.3, 0.1,
0.5, 0.6, 0.2, 0.4, 0.9, 0.8)), .Names = c("Group", "Position",
"Frequency"), class = "data.frame", row.names = c(NA, -9L))