2015-08-25 61 views
6

我有一個看起來像下面這樣的數據幀:值分配給組基於條件

> df = data.frame(group = c(1,1,1,2,2,2,3,3,3), 
       date = c(1,2,3,4,5,6,7,8,9), 
       value = c(3,4,3,4,5,6,6,4,9)) 
> df 
    group date value 
1  1 1  3 
2  1 2  4 
3  1 3  3 
4  2 4  4 
5  2 5  5 
6  2 6  6 
7  3 7  6 
8  3 8  4 
9  3 9  9 

我希望創建一個包含每個與該值相關聯組的日期值的新列值列中的「4」。

以下數據框顯示了我希望完成的工作。

group date value newValue 
1  1 1  3  2 
2  1 2  4  2 
3  1 3  3  2 
4  2 4  4  4 
5  2 5  5  4 
6  2 6  6  4 
7  3 7  6  8 
8  3 8  4  8 
9  3 9  9  8 

正如我們所看到的,組1具有newValue「2」,因爲那是與值「4」相關聯的日期。同樣,第二組有新值4和第三組有新值8.

我假設有一個簡單的方法來使用ave()或dplyr/data.table函數執行此操作,但我一直沒有成功許多嘗試。

+0

@DavidArenburg你說得對!我只是修好了它 –

回答

11

這裏有一個快速data.table一個

library(data.table) 
setDT(df)[, newValue := date[value == 4L], by = group] 
df 
# group date value newValue 
# 1:  1 1  3  2 
# 2:  1 2  4  2 
# 3:  1 3  3  2 
# 4:  2 4  4  4 
# 5:  2 5  5  4 
# 6:  2 6  6  4 
# 7:  3 7  6  8 
# 8:  3 8  4  8 
# 9:  3 9  9  8 

下面是一個類似dplyr版本

library(dplyr) 
df %>% 
    group_by(group) %>% 
    mutate(newValue = date[value == 4L]) 

或過濾後的數據使用merge一個可能的基礎R解決方案(將需要一些之後重命名)

merge(df, df[df$value == 4, c("group", "date")], by = "group") 
+1

正是我所需要的。謝謝! –

+0

@David Arenburg,請在這裏稍微調整一下,https://stackoverflow.com/questions/47716479/data-frame-modification-in-r –

1

這裏是使用鹼R選項

df$newValue = rep(df$date[which(df$value == 4)], table(df$group)) 

另一替代lapply

do.call(rbind, lapply(split(df, df$group), 
    function(x){x$newValue = rep(x$date[which(x$value == 4)], 
        each = length(x$group)); x})) 

# group date value newValue 
#1.1  1 1  3  2 
#1.2  1 2  4  2 
#1.3  1 3  3  2 
#2.4  2 4  4  4 
#2.5  2 5  5  4 
#2.6  2 6  6  4 
#3.7  3 7  6  8 
#3.8  3 8  4  8 
#3.9  3 9  9  8 
1

一個更base R路徑:

df$newValue <- ave(`names<-`(df$value==4,df$date), df$group, FUN=function(x) as.numeric(names(x)[x])) 
df 
    group date value newValue 
1  1 1  3  2 
2  1 2  4  2 
3  1 3  3  2 
4  2 4  4  4 
5  2 5  5  4 
6  2 6  6  4 
7  3 7  6  8 
8  3 8  4  8 
9  3 9  9  8 
10  3 11  7  8 

我用可變長度組的測試。我將date列指定爲邏輯索引value的名稱等於4.然後按組標識值。

數據

df = data.frame(group = c(1,1,1,2,2,2,3,3,3,3), 
       date = c(1,2,3,4,5,6,7,8,9,11), 
       value = c(3,4,3,4,5,6,6,4,9,7))