2017-10-23 12 views
1

私の現在のデータフレームは次のようになります。私はスクリプトに欲しいデータフレームの異なる列に基づいて合計を計算するためのループのR

# Create sample data 
my_df <- data.frame(seq(1, 100), rep(c("ind_1", "", "", ""), times = 25), rep(c("", "ind_2", "", ""), times = 25), rep(c("", "", "ind_3", ""), times = 25), rep(c("", "", "", "ind_4"), times = 25)) 

# Rename columns 
names(my_df)[names(my_df)=="seq.1..100."] <- "value" 
names(my_df)[names(my_df)=="rep.c..ind_1................times...25."] <- "ind_1" 
names(my_df)[names(my_df)=="rep.c......ind_2............times...25."] <- "ind_2" 
names(my_df)[names(my_df)=="rep.c..........ind_3........times...25."] <- "ind_3" 
names(my_df)[names(my_df)=="rep.c..............ind_4....times...25."] <- "ind_4" 

# Replace empty elements with NA 
my_df[my_df==''] = NA 

value列の合計を計算し、むしろシンプルforループです4つの列のそれぞれについて、結果を出力します。

は、これまでのところ、私は非常にわずかな試みがされています:あなたが見ることができるように

# Create a vector with all individuals 
individuals <- c("ind_1", "ind_2", "ind_3", "ind_4") 

# Calculate aggregates for each individual 
for (i in individuals){ 
    ind <- 1 
    sum_i <- aggregate(value~ind_1, data = my_df, sum) 
    print(paste("Individual", i, "possesses an aggregated value of", sum_i$value)) 
    ind <- ind + 1 
} 

が、私は現在、当然、電流出力として次々列に基づいて合計を計算するための正しいコマンドを含めるように苦労し、 ind_1の結果のみを計算します。希望の結果を得るために、aggregateコマンドで何を変更する必要があるのですか(私は初心者ですが、ある列から別の列に進むためにインデックスを使うことを考えていましたか?

+1

最初のヒント:< 'COLNAMES(my_df)を試みる - C( "値"、 "IND_1"、 "ind_2"、 "ind_3"、 "ind_4" ) ' – Jimbou

答えて

2

あなたにもtidyverseを試すことができます。

my_df %>% 
    gather(key, Inds, -value) %>% 
    filter(!is.na(Inds)) %>% 
    group_by(key) %>% 
    summarise(Sum=sum(value)) 
# A tibble: 4 x 2 
    key Sum 
    <chr> <int> 
1 ind_1 1225 
2 ind_2 1250 
3 ind_3 1275 
4 ind_4 1300 

アイデアは長いgatherを使用してデータを作ることです。 NAをフィルタリングしてからIndsでグループ化し、値を要約します。

複数の基地Rの溶液は次のようになります

library(reshape2) 
my_df_long <- melt(my_df, id.vars = "value",value.name = "ID") 
aggregate(value ~ ID, my_df_long, sum, na.rm= T) 
    ID value 
1 ind_1 1225 
2 ind_2 1250 
3 ind_3 1275 
4 ind_4 1300 
+1

2番目の解決策は、ループの必要がないことを教えてくれました。それぞれのパッケージに私を指摘してくれてありがとう。 –

4

you'dはIND-列があなたの個人・ベクトルで表現と一致した場合の合計を計算したいと仮定すると:

individuals <- c("ind_1", "ind_2", "ind_3", "ind_4") 

for (i in 1:(ncol(my_df)-1)){ 
    print(sum(my_df$value[which(my_df[,individuals[i]] == individuals[i])])) 
} 

あなたは別のベクトルに結果を格納するのではなく、print()を使用したいのはなぜ?

+0

私は特別な理由で印刷することを好まなかった。ループ内に別々のベクトルとして格納するには何が必要でしょうか? –

+0

2つのオプションがあります。あらかじめベクトルを作成し、 'i'asインデックスを使ってそれぞれのデータを書き込むことができます。あるいは、ループを通過する間に' cbind() 'することができます。後者の方がはるかに遅いですが、短いベクトルには関係ありません。 – lactea

関連する問題