다음과 같은 데이터 프레임이 있습니다.
> head(dat_sg2)
DwoC_2318_norm.1 DwoC_2318_norm.2 DwoC_2318_norm.3 DwoC_3395_norm.1 DwoC_3395_norm.2 DwoC_3395_norm.3 DwoC_6154_norm.1
Ku8QhfS0n_hIOABXuE 4.865523 4.806292 4.478393 4.539028 4.050325 4.440587 4.110421
Bx496XsFXiAlj.Eaeo 6.123590 6.423548 6.561369 5.856075 5.858094 5.930103 5.801459
W38p0ogk.wIBVRXllY 7.791964 7.648746 7.705958 7.561884 7.699504 7.676182 7.479021
QIBkqIS9LR5DfTlTS8 5.810877 5.579234 5.698071 5.088198 5.076525 5.367539 3.887972
BZKiEvS0eQ305U0v34 6.294961 6.358164 5.876450 5.414746 5.664350 5.924501 4.446681
6TheVd.HiE1UF3lX6g 5.268226 5.337910 5.420836 5.604646 5.007336 5.101670 5.590275
매 3개 열 사이의 평균을 포함하는 데이터프레임을 가져와야 합니다. 따라서 내가 원하는 결과는 6개의 행과 2개의 열입니다(예: DwoC_2318 및 DwoC_3395).
출력은 다음과 같습니다.
DwoC_2318_mean DwoC_3395_mean
Ku8QhfS0n_hIOABXuE 4.716736 4.343313
Bx496XsFXiAlj.Eaeo … …
W38p0ogk.wIBVRXllY … …
QIBkqIS9LR5DfTlTS8 … …
BZKiEvS0eQ305U0v34 … …
6TheVd.HiE1UF3lX6g … …
어디:
4.716736=(4.865523+4.806292+4.478393)/3
내 원래 데이터 프레임은 21개의 열과 약 20,000개의 행으로 구성되어 있습니다.
여기서는 rowMeans와 함께 R 적용 함수를 사용할 수 있을 것 같지만 이를 적용하여 3개 열마다 평균을 계산하는 방법을 모르겠습니다.
나는 15568개의 행과 21개의 열이 있는 전체 데이터 프레임(df)에서 이 작업을 수행하려고 합니다.
groups=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7)
x=apply(df,1,function(x) tapply(x, list(groups), mean))
하지만 15568개의 행과 7개의 열이 출력되지 않습니다.
행 7개, 열 15568개.
답변1
매 3개 행 사이의 평균을 계산하는 것이 더 쉽기 때문에 먼저 데이터프레임을 전치하여 이 문제를 해결했습니다. 나중에 나는 그것을 다시 돌렸다.
#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
답변2
기반으로열 하위 집합의 행 평균 계산
> 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
>
답변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 뒤의 열 수가 3의 배수라고 가정합니다. 예와 같이 후행 열이 하나 또는 두 개 있으면 데이터가 삭제됩니다.