Чтобы обеспечить большую гибкость, которую вы, кажется, желаете, вам необходимо коренным образом реструктурировать свои данные. Как только вы получите его в легко управляемой форме, вы сможете легко проводить любой анализ, какой захотите. Таким образом, затраты на создание этого набора данных возникают в начале, а затем любая операция обходится относительно дешевле. В частности, вы хотите использовать возможности data.frame в R, и поэтому вам необходимо соответственно расплавить / преобразовать свой набор данных, чтобы каждая строка представляла собой наблюдение groupXid с переменными A и B. Ниже приведен один способ выполнить sh, что, using data.table
:
df = data.frame(
A1 = c(15,15,1,5,8),
A2 = c(10,NA,5,3,10),
A3 = c(NA,NA,6,4,10),
A4 = c(NA,NA,5,5,NA),
B1 = c(55,40,29,33,42),
B2 = c(29,NA,18,11,26),
B3 = c(NA,NA,14,8,22),
B4 = c(NA,NA,11,16,NA))
setDT(df)
#each group is a row, so define these groups
df[, group := 1:.N]
#melt where idvar is a group
df = melt(df, id.var = "group")
#variables are defined by the first letter you define, easy to adapt this accordingly
df[, vars := substring(variable,1,1)]
#individuals within a group are defined by the number,
#ie the second character in the column names of your original dataset
df[, id := substring(variable,2)]
df[, variable := NULL]
#now cast so that each row is a groupXid observation, and columns are the variables vars
rdy_dt = dcast(df, group + id ~ vars, value.var = "value")
Итак, у вас есть желаемый набор данных, и теперь вы можете использовать функциональные возможности data.table, чтобы делать все, что захотите. Например, чтобы получить средства, просто выполните
#condition is B >= 17, and we want the mean by group.
rdy_dt[B >= 17, mean(A,na.rm = T), by = group]
group V1
1: 1 12.500000
2: 2 15.000000
3: 3 3.000000
4: 4 5.000000
5: 5 9.333333
И вы можете комбинировать любые наборы условий из нескольких переменных как таковые.