2014-09-30 39 views
0

我有這樣- [R如何改變基於條件(在另一個COL複製)

df <- data.frame(groupx=c("k1","k1","k2","k4","k3","k2"),x1=rep(1,6),x2=rep(2,6), 
x3=rep(3,6),y1=rep(4,6),x12=rep(5,6)) 

以及用於組,每個組重複行的數據幀的多個列,我想通過前綴的修改幾個相關列與編號「a」

目前,我正在做這樣和我相當肯定這不是最有效的方法:

df[duplicated(df$groupx),"x1"]=paste0("a",df[duplicated(df$groupx),"x1"]) 
df[duplicated(df$groupx),"x2"]=paste0("a",df[duplicated(df$groupx),"x2"]) 
df[duplicated(df$groupx),"x3"]=paste0("a",df[duplicated(df$groupx),"x3"]) 

所需的輸出是有相應的前「一」 col x1,x2,x3行,但不包含其他列。

有什麼建議嗎?謝謝

編輯:對不起,誤會。 Groupx行不與山坳的名字有關,前面的例子是一個巧合

回答

2
xCols <- intersect(df$groupx, colnames(df)) 
df[, xCols] <- lapply(df[,xCols], function(x) {indx <- duplicated(df$groupx) 
            x[indx] <-paste0("a", x[indx]); x }) 


    df 
    # groupx x1 x2 x3 y1 x12 
    #1  x1 1 2 3 4 5 
    #2  x1 a1 a2 a3 4 5 
    #3  x2 1 2 3 4 5 
    #4  x4 1 2 3 4 5 
    #5  x3 1 2 3 4 5 
    #6  x2 a1 a2 a3 4 5 

或者

m1 <- as.matrix(df[,xCols]) 
    indx <- duplicated(df[,1])[row(df[,xCols])] 
    m1[indx] <- paste0("a", m1[indx]) 
    df[,xCols] <- m1 
+0

@David Arenburg感謝您的評論。我可能會搞砸了。哦,我明白了,只有列'x1,x2,x3'。我在想這是整列的 – akrun 2014-09-30 12:50:38

+0

這很好。 lapply函數結尾的'x'的目的是什麼? – santoku 2014-09-30 13:43:57

+0

@santoku它是返回完整的向量'x'否則,你將只有'subset'。 – akrun 2014-09-30 13:48:20

2

我假設你想更新只出現在df$groupx列,所以這裏是一個可能的解決方案

indx <- grep(paste0("^", paste(unique(df$groupx), collapse = "$|^"), "$"), names(df)) 
df[duplicated(df$groupx), indx] <- paste0("a", as.matrix(df[duplicated(df$groupx), indx])) 
df 
# groupx x1 x2 x3 y1 x12 
# 1  x1 1 2 3 4 5 
# 2  x1 a1 a2 a3 4 5 
# 3  x2 1 2 3 4 5 
# 4  x4 1 2 3 4 5 
# 5  x3 1 2 3 4 5 
# 6  x2 a1 a2 a3 4 5 
+0

當我不斷思考爲什麼只有x1:x3時,你的'grep'更有意義。 – akrun 2014-09-30 12:59:53

+0

我之前沒有清楚地溝通過。 X1-3只是與groupx相關的3個col – santoku 2014-09-30 13:29:08

相關問題