繁体   English   中英

R- 将值移动到同一行并保持数据帧结构

[英]R- Move values to same row and keep dataframe structure

我的数据最初很宽,但我希望它们是宽和长的混合体。

我设法获得了单独的“值”列,但每个 ID 的值都在单独的行中。

以下是一些示例数据:

structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), .Label = c("1", "2", "3", "4", "5", "6", "7", 
"8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", 
"19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", 
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", 
"41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", 
"52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", 
"63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", 
"74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", 
"85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", 
"96", "97", "98", "99", "100", "101"), class = "factor"), CompMean = c(4, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2.666666667, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 3.666666667, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 3, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA), `P(Rel)` = c(NA, 15L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 70L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 86L, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 81L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA), `P(Rep1.nH.Rel)` = c(NA, NA, 80L, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 36L, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 81L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 10L, NA, 
NA, NA, NA, NA, NA, NA, NA), `P(Rep1.nH.nRel)` = c(NA, NA, NA, 
99L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 52L, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 51L, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 72L, NA, NA, NA, NA, NA, NA, NA), `P(Rep2.nH.Rel.nRep1)` = c(NA, 
NA, NA, NA, 54L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 60L, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 67L, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 55L, NA, NA, NA, NA, NA, NA), `P(Rep2.nH.nRel.nRep1)` = c(NA, 
NA, NA, NA, NA, 66L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
29L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 71L, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 57L, NA, NA, NA, NA, NA), `P(Rep2.nH.Rel.Rep1)` = c(NA, 
NA, NA, NA, NA, NA, 10L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 50L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 70L, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 95L, NA, NA, NA, NA), `P(Rep2.nH.nRel.Rep1)` = c(NA, 
NA, NA, NA, NA, NA, NA, 58L, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 24L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 60L, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 71L, NA, NA, NA), `P(H.Reps)` = c(NA, 
NA, NA, NA, NA, NA, NA, NA, 71L, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 73L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 68L, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 82L, NA, NA), `P(Rel1.Reps)` = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 37L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 61L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
31L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 79L, NA), `P(Rel2.Reps)` = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), Scenario = c("Journalist", 
"Journalist", "Journalist", "Journalist", "Journalist", "Journalist", 
"Journalist", "Journalist", "Journalist", "Journalist", "Journalist", 
"Police", "Police", "Police", "Police", "Police", "Police", "Police", 
"Police", "Police", "Police", "Police", "Reviewer", "Reviewer", 
"Reviewer", "Reviewer", "Reviewer", "Reviewer", "Reviewer", "Reviewer", 
"Reviewer", "Reviewer", "Reviewer", "Spokesperson", "Spokesperson", 
"Spokesperson", "Spokesperson", "Spokesperson", "Spokesperson", 
"Spokesperson", "Spokesperson", "Spokesperson", "Spokesperson", 
"Spokesperson")), row.names = c(NA, -44L), class = c("tbl_df", 
"tbl", "data.frame"))

我希望数据看起来像这样:

structure(list(ID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), Scenario = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Journalist", class = "factor"), 
    p = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4), s = c(47, 47, 47, 47, 
    47, 47, 47, 47, 47, 47), q = c(64, 64, 64, 64, 64, 64, 64, 
    64, 64, 64), y = c(56, 56, 56, 56, 56, 56, 56, 56, 56, 56
    ), z = c(23, 23, 23, 23, 23, 23, 23, 23, 23, 23)), class = "data.frame", row.names = c(NA, 
-10L))

我尝试了几种不同的方法,但到目前为止没有任何效果。 有没有人有什么建议?

编辑有关更多上下文并显示数据的代表性样本,这就是数据最初的样子

structure(list(Condition = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Control", 
"DiffRetract", "SameRetract"), class = "factor"), J_CompMean = c(4, 
3.666666667, 3.333333333, 3.333333333, 3.666666667, 1, 3.333333333, 
1, 1, 6.333333333, 5.333333333, 3, 3.333333333, 3.333333333, 
3, 3, 1.333333333, 2.666666667, 5.333333333, 1.666666667), J_P.Rel. = c(15L, 
68L, 35L, 82L, 61L, 80L, 15L, 57L, 20L, 70L, 50L, 42L, 37L, 40L, 
71L, 65L, 30L, 5L, 42L, 44L), J_P.Rep1.nH.Rel. = c(80L, 13L, 
60L, 90L, 9L, 10L, 10L, 31L, 30L, 17L, 2L, 50L, 85L, 25L, 30L, 
39L, 30L, 60L, 81L, 25L), J_P.Rep1.nH.nRel. = c(99L, 72L, 85L, 
93L, 57L, 100L, 20L, 89L, 100L, 72L, 100L, 60L, 66L, 76L, 21L, 
78L, 92L, 20L, 50L, 94L), J_P.Rep2.nH.Rel.nRep1. = c(54L, 56L, 
30L, 62L, 60L, 80L, 10L, 35L, 10L, 91L, 1L, 50L, 61L, 25L, 38L, 
49L, 21L, 5L, 43L, 38L), J_P.Rep2.nH.nRel.nRep1. = c(66L, 90L, 
84L, 92L, 49L, 100L, 50L, 62L, 98L, 84L, 100L, 50L, 85L, 25L, 
41L, 67L, 42L, 30L, 81L, 83L), J_P.Rep2.nH.Rel.Rep1. = c(10L, 
18L, 30L, 82L, 3L, 60L, 10L, 15L, 20L, 15L, 1L, 50L, 73L, 100L, 
21L, 52L, 62L, 20L, 92L, 31L), J_P.Rep2.nH.nRel.Rep1. = c(58L, 
40L, 80L, 100L, 6L, 60L, 50L, 67L, 100L, 77L, 100L, 50L, 40L, 
100L, 40L, 77L, 81L, 30L, 52L, 97L), J_P.H.Reps. = c(71L, 82L, 
65L, 86L, 44L, 100L, 60L, 81L, 99L, 96L, 70L, 90L, 48L, 75L, 
78L, 87L, 100L, 41L, 50L, 75L), J_P.Rel1.Reps. = c(37L, 62L, 
80L, 69L, 50L, 90L, 90L, 81L, 70L, 93L, 70L, 90L, 48L, 75L, 79L, 
74L, 81L, 51L, 32L, 82L), J_P.Rel2.Reps. = c(NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), P_CompMean = c(2.666666667, 
1.333333333, 1, 2, 2.666666667, 1, 2.666666667, 1, 1, 3.666666667, 
2, 1.333333333, 1.333333333, 1, 1.333333333, 2.666666667, 1, 
1.333333333, 2.666666667, 2), P_P.Rel. = c(70L, 68L, 25L, 72L, 
70L, 60L, 35L, 81L, 100L, 38L, 60L, 37L, 61L, 75L, 75L, 84L, 
90L, 10L, 81L, 90L), P_P.Rep1.nH.Rel. = c(36L, 18L, 25L, 90L, 
6L, 10L, 40L, 15L, 3L, 12L, 1L, 5L, 49L, 25L, 8L, 42L, 11L, 40L, 
10L, 4L), P_P.Rep1.nH.nRel. = c(52L, 63L, 85L, 93L, 51L, 100L, 
90L, 64L, 9L, 87L, 100L, 31L, 51L, 50L, 25L, 62L, 81L, 5L, 71L, 
97L), P_P.Rep2.nH.Rel.nRep1. = c(60L, 15L, 75L, 80L, 19L, 80L, 
40L, 13L, 89L, 39L, 2L, 50L, 59L, 50L, 19L, 26L, 5L, 40L, 71L, 
18L), P_P.Rep2.nH.nRel.nRep1. = c(29L, 70L, 90L, 95L, 30L, 100L, 
95L, 52L, 21L, 98L, 99L, 50L, 62L, 50L, 30L, 80L, 70L, 5L, 52L, 
73L), P_P.Rep2.nH.Rel.Rep1. = c(50L, 48L, 35L, 50L, 2L, 10L, 
40L, 22L, 10L, 69L, 1L, 50L, 32L, 25L, 10L, 57L, 20L, 21L, 71L, 
6L), P_P.Rep2.nH.nRel.Rep1. = c(24L, 27L, 40L, 54L, 5L, 10L, 
10L, 19L, 20L, 7L, 2L, 40L, 68L, 100L, 20L, 41L, 20L, 51L, 51L, 
18L), P_P.H.Reps. = c(73L, 84L, 80L, 41L, 51L, 100L, 80L, 80L, 
100L, 100L, 50L, 65L, 83L, 100L, 85L, 90L, 100L, 5L, 30L, 69L
), P_P.Rel1.Reps. = c(61L, 82L, 80L, 100L, 91L, 80L, 41L, 80L, 
100L, 100L, 40L, 95L, 80L, 76L, 87L, 83L, 100L, 70L, 71L, 79L
), P_P.Rel2.Reps. = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_), R_CompMean = c(3.666666667, 1.333333333, 
1.333333333, 1.666666667, 5, 1, 5, 1, 5, 5, 1, 2, 2.666666667, 
2.666666667, 1, 3, 1.666666667, 1, 4.333333333, 5.333333333), 
    R_P.Rel. = c(86L, 75L, 35L, 71L, 100L, 70L, 90L, 71L, 70L, 
    37L, 50L, 60L, 50L, 50L, 85L, 61L, 40L, 50L, 52L, 54L), R_P.Rep1.nH.Rel. = c(81L, 
    59L, 95L, 87L, 51L, 100L, 70L, 79L, 71L, 85L, 100L, 30L, 
    60L, 75L, 56L, 69L, 92L, 10L, 51L, 88L), R_P.Rep1.nH.nRel. = c(51L, 
    51L, 60L, 79L, 41L, 100L, 10L, 30L, 19L, 27L, 1L, 50L, 58L, 
    25L, 63L, 42L, 11L, 60L, 61L, 18L), R_P.Rep2.nH.Rel.nRep1. = c(67L, 
    72L, 80L, 92L, 62L, 100L, 30L, 45L, 71L, 91L, 100L, 50L, 
    70L, 24L, 30L, 79L, 25L, 20L, 51L, 89L), R_P.Rep2.nH.nRel.nRep1. = c(71L, 
    23L, 60L, 92L, 9L, 70L, 5L, 9L, 50L, 38L, 1L, 50L, 60L, 90L, 
    19L, 37L, 51L, 50L, 31L, 18L), R_P.Rep2.nH.Rel.Rep1. = c(70L, 
    44L, 90L, 95L, 60L, 100L, 72L, 60L, 10L, 96L, 100L, 50L, 
    62L, 100L, 29L, 78L, 91L, 20L, 50L, 82L), R_P.Rep2.nH.nRel.Rep1. = c(60L, 
    38L, 90L, 95L, 60L, 60L, 95L, 40L, 20L, 79L, 100L, 50L, 53L, 
    90L, 41L, 82L, 71L, 5L, 50L, 70L), R_P.H.Reps. = c(68L, 60L, 
    80L, 100L, 10L, 80L, 62L, 71L, 31L, 32L, 85L, 70L, 65L, 100L, 
    71L, 73L, 61L, 30L, 50L, 48L), R_P.Rel1.Reps. = c(31L, 80L, 
    90L, 100L, 2L, 80L, 84L, 89L, 49L, 29L, 85L, 70L, 70L, 50L, 
    85L, 78L, 61L, 85L, 50L, 32L), R_P.Rel2.Reps. = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_), S_CompMean = c(3, 
    1.666666667, 2.333333333, 1.666666667, 4.333333333, 1, 5.333333333, 
    1.666666667, 2, 6.666666667, 1, 3, 1, 1.666666667, 2.666666667, 
    3, 1, 3, 3, 5.666666667), S_P.Rel. = c(81L, 68L, 40L, 72L, 
    69L, 60L, 35L, 80L, 100L, 61L, 50L, 27L, 59L, 75L, 64L, 63L, 
    70L, 20L, 83L, 74L), S_P.Rep1.nH.Rel. = c(10L, 10L, 25L, 
    71L, 19L, 10L, 20L, 17L, 4L, 4L, 2L, 10L, 45L, 75L, 30L, 
    42L, 10L, 20L, 21L, 22L), S_P.Rep1.nH.nRel. = c(72L, 69L, 
    85L, 100L, 61L, 100L, 90L, 84L, 4L, 99L, 100L, 30L, 58L, 
    50L, 83L, 79L, 80L, 20L, 61L, 82L), S_P.Rep2.nH.Rel.nRep1. = c(55L, 
    18L, 60L, 61L, 15L, 100L, 70L, 22L, 9L, 31L, 1L, 50L, 72L, 
    49L, 59L, 40L, 21L, 5L, 73L, 31L), S_P.Rep2.nH.nRel.nRep1. = c(57L, 
    91L, 85L, 100L, 59L, 100L, 90L, 53L, 20L, 75L, 100L, 50L, 
    55L, 50L, 60L, 57L, 20L, 10L, 72L, 93L), S_P.Rep2.nH.Rel.Rep1. = c(95L, 
    19L, 30L, 89L, 53L, 40L, 30L, 10L, 0L, 35L, 1L, 50L, 54L, 
    100L, 80L, 37L, 21L, 50L, 79L, 20L), S_P.Rep2.nH.nRel.Rep1. = c(71L, 
    40L, 90L, 96L, 99L, 100L, 90L, 61L, 6L, 86L, 1L, 50L, 57L, 
    90L, 84L, 63L, 81L, 10L, 52L, 77L), S_P.H.Reps. = c(82L, 
    80L, 70L, 91L, 41L, 100L, 31L, 76L, 90L, 36L, 85L, 85L, 76L, 
    100L, 71L, 73L, 100L, 70L, 70L, 43L), S_P.Rel1.Reps. = c(79L, 
    82L, 70L, 92L, 41L, 90L, 20L, 79L, 90L, 21L, 85L, 85L, 73L, 
    75L, 81L, 73L, 80L, 15L, 75L, 34L), S_P.Rel2.Reps. = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_), ID = structure(1:20, .Label = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 
    "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", 
    "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", 
    "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", 
    "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", 
    "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", 
    "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", 
    "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", 
    "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", 
    "93", "94", "95", "96", "97", "98", "99", "100", "101"), class = "factor")), row.names = c(NA, 
20L), class = "data.frame")

我希望我的数据如下所示:

Condition <- rep(c("Control", "Same", "Diff"), each = 4, length.out = 20)
ID <- rep(1:5, each = 4) 
Scenario <- rep(c("J", "P", "R", "S"), times = 5)
A <- round(runif(20, min = 0, max = 6), digits = 0)
B <- round(runif(20, min = 0, max  = 100), digits = 0)
C <- round(runif(20, min = 0, max = 100), digits = 0)
D <- round(runif(20, min = 0, max = 100), digits = 0)

df <- data.frame(ID, Scenario, Condition, A, B, C, D)
df$E <-
  ifelse(
    df$Condition == "Same",
    round(runif(8, min = 0, max = 100), digits = 0),
    ifelse(Condition == "Control" | Condition == "Diff", "NA", NA)
  )

head(df)

我尝试了几件事,包括:

df[, lapply(.SD, function(x) first(na.omit(x))), by = ID]

但后来我只剩下一个“场景”级别的值,而没有其他级别的值。

我一直在使用 R 相当长的时间,但正如您可能会说我不是一个伟大的程序员,所以将非常感谢这个问题的解决方案。 如果有什么不清楚的,请告诉我!

你需要这样的东西吗?

library(tidyr)

df %>%
  pivot_longer(values_drop_na = TRUE, cols = -c(ID, Scenario)) %>%
  pivot_wider()

#  ID    Scenario CompMean `P(Rel)` `P(Rep1.nH.Rel)` `P(Rep1.nH.nRel… `P(Rep2.nH.Rel.…
#  <fct> <chr>       <dbl>    <dbl>            <dbl>            <dbl>            <dbl>
#1 1     Journal…     4          15               80               99               54
#2 1     Police       2.67       70               36               52               60
#3 1     Reviewer     3.67       86               81               51               67
#4 1     Spokesp…     3          81               10               72               55
# … with 5 more variables: `P(Rep2.nH.nRel.nRep1)` <dbl>, `P(Rep2.nH.Rel.Rep1)` <dbl>,
#   `P(Rep2.nH.nRel.Rep1)` <dbl>, `P(H.Reps)` <dbl>, `P(Rel1.Reps)` <dbl>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM