2016-11-14 4 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, где Jen, фактор b также переходит в V2, а не V3.

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

Любая помощь была бы принята с благодарностью!

спасибо.

ответ

1

Вы можете сделать первую часть с dcast в пакете reshape, а затем отсортировать их по желанию с помощью 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

Привет Жильбер, спасибо за ответ! Не могли бы вы еще раз взглянуть на почту? Я сделал небольшое изменение, так что мой вопрос яснее. Спасибо. – Starbucks

1

Похоже, что вы хотите вектор V2 уровней, которые присутствуют на каждом уровне V1 (Individual). Это не действительно как столбцы предназначены для работы в 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