2017-09-28 16 views
1

我有這樣一個數據幀:替換ID與價值計數變量值出現

 DATE x  y ID 
06/10/2003 7.21 0.651 1 
12/10/2003 5.99 0.428 1 
18/10/2003 4.68 1.04 1 
24/10/2003 3.47 0.363 1 
30/10/2003 2.42 0.507 1 
02/05/2010 2.72 0.47 2 
05/05/2010 2.6 0. 646  2 
08/05/2010 2.67 0.205 2 
11/05/2010 3.57 0.524 2 
12/05/2010 0.428 4.68 3 
13/05/2010 1.04 3.47 3 
14/05/2010 0.363 2.42 3 
18/10/2003 0.507 2.52 3 
24/10/2003 0.418 4.68 3 
30/10/2003 0.47 3.47 3 
29/04/2010 0.646 2.42 4 
18/10/2003 3.47 2.52 4 

我有每組的行列ID的數目的計數作爲像5 4 6 2

的整數矢量

是有辦法與這些整數矢量來替換在列ID的組值5 4 6 2

我期待的輸出是

DATE x y ID 
06/10/2003 7.21 0.651 5 
12/10/2003 5.99 0.428 5 
18/10/2003 4.68 1.04 5 
24/10/2003 3.47 0.363 5 
30/10/2003 2.42 0.507 5 
02/05/2010 2.72 0.47 4 
05/05/2010 2.6  646 4 
08/05/2010 2.67 0.205 4 
11/05/2010 3.57 0.524 4 
12/05/2010 0.428 4.68 6 
13/05/2010 1.04 3.47 6 
14/05/2010 0.363 2.42 6 
18/10/2003 0.507 2.52 6 
24/10/2003 0.418 4.68 6 
30/10/2003 0.47 3.47 6 
29/04/2010 0.646 2.42 2 
18/10/2003 3.47 2.52 2 

我對R相當陌生,並試圖找到是否有任何想法替換功能。但是很難過。任何幫助深表感謝。

上面的數據只是一個理解我的要求的例子。

回答

1

dplyr A液:

library(dplyr) 
df %>% 
    group_by(ID) %>% 
    mutate(ID2 = n()) %>% 
    ungroup() %>% 
    mutate(ID = ID2) %>% 
    select(-ID2) 

編輯:

我剛剛找到了解決辦法,這比上述清潔了一下:

df %>% 
    group_by(ID2 = ID) %>% 
    mutate(ID = n()) %>% 
    select(-ID2) 

結果:

# A tibble: 17 x 4 
     DATE  x  y ID 
     <fctr> <dbl> <dbl> <int> 
1 06/10/2003 7.210 0.651  5 
2 12/10/2003 5.990 0.428  5 
3 18/10/2003 4.680 1.040  5 
4 24/10/2003 3.470 0.363  5 
5 30/10/2003 2.420 0.507  5 
6 02/05/2010 2.720 0.470  4 
7 05/05/2010 2.600 0.646  4 
8 08/05/2010 2.670 0.205  4 
9 11/05/2010 3.570 0.524  4 
10 12/05/2010 0.428 4.680  6 
11 13/05/2010 1.040 3.470  6 
12 14/05/2010 0.363 2.420  6 
13 18/10/2003 0.507 2.520  6 
14 24/10/2003 0.418 4.680  6 
15 30/10/2003 0.470 3.470  6 
16 29/04/2010 0.646 2.420  2 
17 18/10/2003 3.470 2.520  2 

注:

背後ungroup() %>% mutate(ID = ID2) %>% select(-ID2)的原因是dplyr沒有按對分組變量不允許使用mutate。所以這是行不通的:

df %>% 
    group_by(ID) %>% 
    mutate(ID = n()) 

錯誤mutate_impl(。數據點):列ID不能修改 因爲它是一個分組變量

如果你不關心取代了原有的ID列,你可以做:

df %>% 
    group_by(ID) %>% 
    mutate(ID2 = n()) 

替代結果:

# A tibble: 17 x 5 
# Groups: ID [4] 
     DATE  x  y ID ID2 
     <fctr> <dbl> <dbl> <int> <int> 
1 06/10/2003 7.210 0.651  1  5 
2 12/10/2003 5.990 0.428  1  5 
3 18/10/2003 4.680 1.040  1  5 
4 24/10/2003 3.470 0.363  1  5 
5 30/10/2003 2.420 0.507  1  5 
6 02/05/2010 2.720 0.470  2  4 
7 05/05/2010 2.600 0.646  2  4 
8 08/05/2010 2.670 0.205  2  4 
9 11/05/2010 3.570 0.524  2  4 
10 12/05/2010 0.428 4.680  3  6 
11 13/05/2010 1.040 3.470  3  6 
12 14/05/2010 0.363 2.420  3  6 
13 18/10/2003 0.507 2.520  3  6 
14 24/10/2003 0.418 4.680  3  6 
15 30/10/2003 0.470 3.470  3  6 
16 29/04/2010 0.646 2.420  4  2 
17 18/10/2003 3.470 2.520  4  2 
2

您可以使用ave()函數計算每個ID佔用多少行。在下面的示例中,我創建了一個新變量ID2,但如果需要,您可以替換原始ID。我在下面的代碼中創建了你的數據,但是當你在將來提出問題時,請在數據對象上使用dput()函數將你的數據包含在問題中。 。)

mydata <- structure(list(DATE = c("06/10/2003", "12/10/2003", "18/10/2003", 
         "24/10/2003", "30/10/2003", "02/05/2010", "05/05/2010", "08/05/2010", 
         "11/05/2010", "12/05/2010", "13/05/2010", "14/05/2010", "18/10/2003", 
         "24/10/2003", "30/10/2003", "29/04/2010", "18/10/2003"), 
        x = c(7.21, 5.99, 4.68, 3.47, 2.42, 2.72, 2.6, 2.67, 3.57, 0.428, 1.04, 0.363, 
         0.507, 0.418, 0.47, 0.646, 3.47), 
        y = c(0.651, 0.428, 1.04, 0.363, 0.507, 0.47, 646, 0.205, 0.524, 4.68, 3.47, 
         2.42, 2.52, 4.68, 3.47, 2.42, 2.52), 
      ID = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4)), 
      .Names = c("DATE", "x", "y", "ID"), 
      class = c("data.frame"), 
      row.names = c(NA, -17L)) 

# ave() takes an input object, an object of group IDs of the same length 
# as the input object, and a function to apply to the input object split across groups   
mydata$ID2 <- ave(mydata$ID, mydata$ID, FUN = length) 

mydata 

    DATE  x  y  ID ID2 
1 06/10/2003 7.210 0.651 1 5 
2 12/10/2003 5.990 0.428 1 5 
3 18/10/2003 4.680 1.040 1 5 
4 24/10/2003 3.470 0.363 1 5 
5 30/10/2003 2.420 0.507 1 5 
6 02/05/2010 2.720 0.470 2 4 
7 05/05/2010 2.600 646.000 2 4 
8 08/05/2010 2.670 0.205 2 4 
9 11/05/2010 3.570 0.524 2 4 
10 12/05/2010 0.428 4.680 3 6 
11 13/05/2010 1.040 3.470 3 6 
12 14/05/2010 0.363 2.420 3 6 
13 18/10/2003 0.507 2.520 3 6 
14 24/10/2003 0.418 4.680 3 6 
15 30/10/2003 0.470 3.470 3 6 
16 29/04/2010 0.646 2.420 4 2 
17 18/10/2003 3.470 2.520 4 2 

# if you want to replace the original ID variable, you can assign to it 
# instead of adding a new variable 
mydata$ID <- ave(mydata$ID, mydata$ID, FUN = length) 
+0

非常感謝。測試結果。這正是我期待的。 –

2

data.table -package甲緊湊的解決方案:

library(data.table) 
setDT(mydf)[, ID := .N, by = ID][] 

這給:

> mydf 
      DATE  x  y ID 
1: 06/10/2003 7.210 0.651 5 
2: 12/10/2003 5.990 0.428 5 
3: 18/10/2003 4.680 1.040 5 
4: 24/10/2003 3.470 0.363 5 
5: 30/10/2003 2.420 0.507 5 
6: 02/05/2010 2.720 0.470 4 
7: 05/05/2010 2.600 0.646 4 
8: 08/05/2010 2.670 0.205 4 
9: 11/05/2010 3.570 0.524 4 
10: 12/05/2010 0.428 4.680 6 
11: 13/05/2010 1.040 3.470 6 
12: 14/05/2010 0.363 2.420 6 
13: 18/10/2003 0.507 2.520 6 
14: 24/10/2003 0.418 4.680 6 
15: 30/10/2003 0.470 3.470 6 
16: 29/04/2010 0.646 2.420 2 
17: 18/10/2003 3.470 2.520 2 

這裏做的事情:

  • setDT(mydf)數據幀轉換爲data.table
  • by = ID團b ŸID
  • ID := .N按組取代的ID與計原值