Chcę zmienić dane w formacie szerokim, ale chcę wziąć średnią z trzeciej kolumny związanej z wpisami czwartej kolumny. Lubić (0.21+0.05+0.06)/total
. Przeczytałem o reshape
pakiet w języku R, ale nie wiem, której funkcji agregującej użyć, która znajdzie średnią przed konwersją do formatu szerokiego
Wprowadź ramkę danych
CID100000085 C0000737 0.21 Abdominal pain
CID100000085 C0000737 0.21 Gastrointestinal pain
CID100000085 C0000737 0.05 Abdominal pain
CID100000085 C0000737 0.05 Gastrointestinal pain
CID100000085 C0000737 0.06 Abdominal pain
CID100000085 C0000737 0.06 Gastrointestinal pain
Pożądane wyjście
Abdominal pain Gastrointestinal pain
CID100000085 C0000737 0.0166 0.0166
Odpowiedzi:
3 dla odpowiedzi № 1Możemy po prostu użyć dcast
library(data.table)
dcast(setDT(df1), id1+id2~pain, value.var = "value", mean)
# id1 id2 Abdominal pain Gastrointestinal pain
#1: CID100000085 C0000737 0.1066667 0.1066667
dane
df1 <- structure(list(id1 = c("CID100000085", "CID100000085", "CID100000085",
"CID100000085", "CID100000085", "CID100000085"), id2 = c("C0000737",
"C0000737", "C0000737", "C0000737", "C0000737", "C0000737"),
value = c(0.21, 0.21, 0.05, 0.05, 0.06, 0.06), pain = c("Abdominal pain",
"Gastrointestinal pain", "Abdominal pain", "Gastrointestinal pain",
"Abdominal pain", "Gastrointestinal pain")),
.Names = c("id1",
"id2", "value", "pain"), class = "data.frame", row.names = c(NA,
-6L))
2 dla odpowiedzi nr 2
Możesz spróbować aggregate
razem z reshape
w bazie R:
reshape(aggregate(V3~V1+V2+V4, df, mean),
idvar = "V1", timevar = "V4", direction = "wide")[,-4]
# V1 V2.Abdominalpain V3.Abdominalpain V3.Gastrointestinalpain
#1 CID100000085 C0000737 0.1066667 0.1066667
Dane
df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "CID100000085", class = "factor"),
V2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "C0000737", class = "factor"),
V3 = c(0.21, 0.21, 0.05, 0.05, 0.06, 0.06), V4 = structure(c(1L,
2L, 1L, 2L, 1L, 2L), .Label = c("Abdominalpain", "Gastrointestinalpain"
), class = "factor")), .Names = c("V1", "V2", "V3", "V4"), class = "data.frame", row.names = c(NA,
-6L))