2017-05-14 9 views
1

私のdfには2つ以上の列があります(たとえば4)。私は1列のパーセント差を計算する

time1   time2   time3   time4 
    1    5    1    10 
    2    2    2    4 
    3    6    3    12 

私のコード列に比べて、列2-4のパーセント差を計算したいです:

timepoint <- colnames(df)[2:4] 
for (x in timepoint){ 
df$x <- 100*(df$x/df$time1-1) 
} 

機能のためにこれで間違っているのですか?ありがとうございました!

+2

あなたのそう遠くないと思うが、あなたは 'のdfの$ X 'を行うカント、あなたは' DF [[x]を実行する必要があります] 'を呼び出す。それ以外の場合は' x'という変数を探す。したがって、 'df [[x]] < - 100 *(df [[x]]/df $ time1-1)'を使用してください。しかしループは '100 *(df [-1]/df [、1] - 1)'を実行する必要があります。 – user2957945

+0

@Sotosありがとうございます!作品!! – datanew

答えて

0

多分これが長すぎる答えですが、私はそれがスタートステップ

library(dplyr) 
library(tibble) 
library(tidyr) 

df <- tribble(
    ~time1, ~time2, ~time3, ~time4, 
    1, 5, 1, 10, 
    2, 2, 2, 4, 
    3, 6, 3, 12 
) 

df_tidy <- df %>% 
    mutate(id = 1:nrow(.)) %>% 
    gather(time, value, time1:time4) %>% 
    mutate(id_base = ifelse(time == "time1", TRUE, FALSE)) 

df_calc <- filter(df_tidy, id_base == FALSE) 

df_base <- df_tidy %>% 
    filter(id_base== TRUE) %>% 
    select(id, value_base = value) 

df_join <- df_calc %>% 
    left_join(
    df_base, 
    by = "id" 
) 

df_join %>% 
    mutate(diff = (value/value_base) * 100) 
# A tibble: 9 × 4 
    id time value diff 
    <int> <chr> <dbl> <dbl> 
1  1 time2  5 500 
2  2 time2  2 100 
3  3 time2  6 200 
4  1 time3  1 100 
5  2 time3  2 100 
6  3 time3  3 100 
7  1 time4 10 1000 
8  2 time4  4 200 
9  3 time4 12 400