2016-11-14 144 views
1

我有兩個變量與多個級別; V1有400級,V2有≈250級。我怎樣才能將V2的因素轉換成幾個不同的變量,並將變量V1作爲唯一標識符?R將因子轉換爲新變量

V1    V2 
Garza, Mike a 
Garza, Mike b 
Smith, James a 
Smith, James f 
Smith, James z 
Moore, Jen  b 
Klein, April f 

數據幀應該看起來像下面的例子。注意:變量如何包含多個因子,而不是每個因子的一個變量。考慮到邁克有兩個與他相關的因素,因素a和b進入V2和V3,其中因子b也進入V2而不是V3。

V1    V2 V3 V4 V5 
Garza, Mike a b 
Smith, James a f z 
Moore, Jen  b 
Klein, April f 

任何幫助將不勝感激!

謝謝。

回答

1

您可以在reshape包中執行dcast的第一部分,然後使用apply將它們進一步分類爲所需的輸出。

dat <- data.frame(V1 = factor(c("Garza", "Garza", 
          "Smith", "Smith", "Smith", 
          "Moore", "Klein")), 
        V2 = c("a","b","a","f","z","b","f")) 

# recast your data 
dd <- dcast(dat, V1~V2) 

#make a function to use with apply 

shift_values<- function(x){ 
    notna <-which(!is.na(x[-1])) 
    val <- x[notna+1] 
    x[-1] <- c(as.character(val), rep("", (length(x)-1-length(val)))) 
    return(x) 
} 

# use it in an apply loop, transpose the data, and turn it into a data.frame 
result <- data.frame(t(apply(dd, 1, shift_values))) 

# change the column names 
colnames(result)[-1] <- paste0("V", 2:(ncol(result))) 

的數據則是這樣的:

 V1 V2 V3 V4 V5 
1 Garza a b  
2 Klein f   
3 Moore b   
4 Smith a f z 
3

這是一個重塑問題。考慮df是你data.frame,你可以嘗試使用這樣的:

> library(reshape2) 
> print(dcast(melt(df), ...~V2), na.print="") 
Using V1, V2 as id variables 
Using V2 as value column: use value.var to override. 
      V1 a b f z 
1 Garza,Mike a b  
2 Klein,April  f 
3 Moore,Jen b  
4 Smith,James a f z 
+0

嗨Jilber,對於回​​復的感謝!你能再看看這個帖子嗎?我做了一個小小的修改,讓我的問題更清楚。謝謝。 – Starbucks

1

看來,你想要的V2的水平,存在每個V1水平(個人)的載體。這不是確實列的設計方式是如何在data.frames中工作,即使您可以在Excel中執行此操作。相反,我建議你只是讓結果的向量對每一個人來說,像這樣:

split(df$V2, df$V1) 

返回:

$`Garza, Mike` 
[1] a b 
Levels: a b f z 

$`Klein, April` 
[1] f 
Levels: a b f z 

$`Moore, Jen` 
[1] b 
Levels: a b f z 

$`Smith, James` 
[1] a f z 
Levels: a b f z 

不知道您的使用情況下,我不能說,如果這實際上會更好或不會。但是,根據我的一般經驗,它更容易處理。如果你只需要打印它們,你可以隨時摺疊它們。例如,如果您保存上述split結果out,你能做到這一點,那麼它可以作爲一個列到其他輸出表:

out <- split(df$V2, df$V1) 

sapply(out, paste, collapse = ", ") 

Garza, Mike Klein, April Moore, Jen Smith, James 
     "a, b"   "f"   "b" "a, f, z" 

或者,如果你想知道誰具有一定的羣體,你可以這樣做:

sapply(out, function(x){"f" %in% x}) 

其中給出:

Garza, Mike Klein, April Moore, Jen Smith, James 
     FALSE   TRUE  FALSE   TRUE 
相關問題