2013-10-06 49 views
0

我已經將此文件讀入R中的data.frame,並且您可以看到第5列包含用「;」分隔的一些值。是否有可能將這個數據框架變成一個更大的數據框架,並將第5列擴展爲二進制矢量?R將data.frame的一列更改爲二進制向量

> head(uinfo) 
     V1 V2 V3 V4        V5 
1 100044 1899 1 5 831;55;198;8;450;7;39;5;111 
2 100054 1987 2 6        0 
3 100065 1989 1 57        0 
4 100080 1986 1 31 113;41;44;48;91;96;42;79;92;35 
5 100086 1986 1 129        0 
6 100097 1981 1 75        0 

所以,作爲一個簡單的例子,如果我的前兩行分別是:

1 100044 1899 1 5 1;2;4;7 
2 100054 1987 2 6 3;8 

我想:

1 100044 1899 1 5 1 1 0 1 0 0 1 0 0 0 
2 100054 1987 2 6 0 0 1 0 0 0 0 1 0 0 

我必須使用其他程序,如蟒蛇用於預處理數據,還是可以通過某些應用函數來實現?

感謝

+0

你好,重複的例子(即東西,可切+ paste'd)將是有益的。你可以使用'reproduce()'。看看http://bit.ly/SORepro的說明 –

回答

4

你可以從我的 「splitstackshape」 包試試concat.split.expanded功能:

library(splitstackshape) 
mydf 
#  V1 V2 V3 V4  V5 
# 1 100044 1899 1 5 1;2;4;7 
# 2 100054 1987 2 6  3;8 
concat.split.expanded(mydf, "V5", sep=";", fill = 0) 
#  V1 V2 V3 V4  V5 V5_1 V5_2 V5_3 V5_4 V5_5 V5_6 V5_7 V5_8 
# 1 100044 1899 1 5 1;2;4;7 1 1 0 1 0 0 1 0 
# 2 100054 1987 2 6  3;8 0 0 1 0 0 0 0 1 

添加drop = TRUE擺脫原始列的。


這裏, 「是myDF」 被定義爲:

mydf <- structure(list(V1 = c(100044L, 100054L), V2 = c(1899L, 1987L), 
    V3 = 1:2, V4 = 5:6, V5 = c("1;2;4;7", "3;8")), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, -2L)) 
+1

+1非常好!我不熟悉'splitstackshape' –

+0

@RicardoSaporta,謝謝。這是一項正在進行中的工作。 – A5C1D2H2I1M1N2O1R2T1

+0

我正在查看它,非常酷 –

1

這裏的想法是,有兩個要求:

  1. 分裂的semicolon`
  2. 數據
  3. 創建列,用零/假填充空列

#1很簡單:使用strsplit
#2可以通過沿着新列的數量進行排序並檢查它們是否位於新噴濺的字符串中來完成。

library(data.table) 

    largest <- 1e3 # (Whatever your largest expected value) 
    newColNames <- as.character(seq(largest)) 
    dat[, (newColNames) := as.data.table(t(sapply(strsplit(V5, ";"), "%in%", x=seq(largest))))] 

    # if you really want numeric (as opposed to logical) 
    dat[, (newColNames) := lapply(.SD, as.numeric), .SDcols=newColNames] 
1

使用基礎功能(步驟太多,我認爲)

> df <- read.table(text=" 100044 1899 1 5 1;2;4;7 
+ 100054 1987 2 6 3;8", header=F, stringsAsFactors=F) # data.frame 


> pos <- sapply(strsplit(as.character(df[,5]), ";"), as.numeric) 
> x <-rep(0, max(unlist(pos))) 
> cbind(df, t(sapply(pos, function(y) replace(x, y, 1)))) 
     V1 V2 V3 V4  V5 1 2 3 4 5 6 7 8 
1 100044 1899 1 5 1;2;4;7 1 1 0 1 0 0 1 0 
2 100054 1987 2 6  3;8 0 0 1 0 0 0 0 1 
相關問題