Как рассчитать среднее значение каждых 3 столбцов во фрейме данных?

Me pasó algo similar cuando intentaba eliminar una carpeta vacía de un servidor remoto. Esto es lo que ls -alestaba dando como salida:

??????????   ? ?       ?       ? ? latest

Esta era una carpeta dentro de otra carpeta y quería eliminarla. Probé rmdiry esto es lo que obtuve:

rm: cannot remove: latest: Invalid argument

Nada parecía funcionar directamente en esa carpeta (no rm -f, no touch, nada ). Sin embargo, intenté cambiar el nombre de la carpeta principal y la carpeta latestvolvió a ser normal, que luego pude eliminar usando rm.

-1
20.04.2019, 10:45
3 ответа

Поскольку я не очень хорошо разбираюсь в R, вместо этого я попробую awkрешение:

$ awk 'NR == 1 { next } { j=0; for (i = 2; i+2 <= NF; i+=3) m[++j] = ($(i+0)+$(i+1)+$(i+2))/3; $0 = $1; for (i=1; i<=j; ++i) $(i+1)=m[i]; print }' file
Ku8QhfS0n_hIOABXuE 4.71674 4.34331
Bx496XsFXiAlj.Eaeo 6.3695 5.88142
W38p0ogk.wIBVRXllY 7.71556 7.64586
QIBkqIS9LR5DfTlTS8 5.69606 5.17742
BZKiEvS0eQ305U0v34 6.17653 5.66787
6TheVd.HiE1UF3lX6g 5.34232 5.23788

Аннотированный awkскрипт:

# Skip header
NR == 1 { next }

{
    j = 0

    # Go through the columns from column 2 onwards in groups of thee columns,
    # calculating the average of the group and store it in the array m.
    for (i = 2; i + 2 <= NF; i += 3)
        m[++j] = ($(i+0) + $(i+1) + $(i+2))/3

    # Rewrite the current row as the first column only.
    $0 = $1

    # Add the calculated averages as new columns after column 1.
    for (i = 1; i <= j; ++i)
        $(i+1) = m[i]

    print
}

Код предполагает, что количество столбцов после столбца 1 кратно трем. Если есть один или два завершающих столбца (, как в примере ), эти данные будут удалены.

0
28.04.2021, 23:34

Я решил это, переместив сначала фрейм данных, потому что мне было проще вычислить средние значения между каждыми тремя строками. Позже я переложил его обратно.

#read in data
df=read.table("DwoC", header=T)
#transpose it
df <- as.data.frame(t(df))
# remove.1,.2,...strings from row names, and save unique row names
rn=unique(gsub("\\..*","",rownames(df)))
n=3
# calculate means between each 3 rows
dd=aggregate(df,list(rep(1:(nrow(df)%/%n+1),each=n,len=nrow(df))),mean)[-1]
# transpose it back
dt <- as.data.frame(t(dd))
# rename columns as the names were lost during transpose step
names(dt)=rn 
0
28.04.2021, 23:34

На основе Вычислить средние значения строки для подмножества столбцов

> df = read.table('file')
> 
> data.frame(ID=df[,0], DwoC_2318_mean=rowMeans(df[1:3]), DwoC_3395_mean=rowMeans(df[4:6]))
                   DwoC_2318_mean DwoC_3395_mean
Ku8QhfS0n_hIOABXuE       4.716736       4.343313
Bx496XsFXiAlj.Eaeo       6.369502       5.881424
W38p0ogk.wIBVRXllY       7.715556       7.645857
QIBkqIS9LR5DfTlTS8       5.696061       5.177421
BZKiEvS0eQ305U0v34       6.176525       5.667866
6TheVd.HiE1UF3lX6g       5.342324       5.237884
> 
0
28.04.2021, 23:34

Теги

Похожие вопросы