24

多段階サンプリング方式からプライマリ、セカンダリ、および究極のサンプリング ユニットを識別する数値 ID 変数を持つデータ フレームがあります。元の ID 変数を 3 つの新しい変数に分割し、異なるサンプリング単位を個別に識別したいと考えています。

例:

>df[1:2,]
ID Var        var1     var2      var3     var4         var5  
501901          9    SP.1          1        W         12.10    
501901          9    SP.1          2        W         17.68  

私が欲しいもの:

>df[1:2,]
ID1    ID2     ID3   var1   var2  var3     var4    var5  
5      01      901    9    SP.1    1        W     12.10    
5      01      901    9    SP.1    2        W     17.68  

文字列を分割するために R で使用できる関数がいくつかあることは知っていますが、数値に対して同じ機能を見つけることができませんでした。

ありがとうございました、

ファン

4

7 に答える 7

21

たとえば、次のように使用できますsubstring

df <- data.frame(ID = c(501901, 501902))

splitted <- t(sapply(df$ID, function(x) substring(x, first=c(1,2,4), last=c(1,3,6))))
cbind(df, splitted)
#      ID 1  2   3
#1 501901 5 01 901
#2 501902 5 01 902
于 2013-03-19T11:38:21.807 に答える
13

さらに別のread.fwf方法は、幅を使用して最初の列を再読み込みし、指定することです。

cbind(read.fwf(file = textConnection(as.character(df[, 1])), 
               widths = c(1, 2, 3), colClasses = "character", 
               col.names = c("ID1", "ID2", "ID3")), 
      df[-1])
#   ID1 ID2 ID3 var1 var2 var3 var4  var5
# 1   5  01 901    9 SP.1    1    W 12.10
# 2   5  01 901    9 SP.1    2    W 17.68

ここでの利点の1つは、結果の列名を便利な方法で設定し、列が文字であることを確認できるため、存在する可能性のある先行ゼロを保持できることです。

于 2013-03-19T12:04:55.300 に答える
5

This should work:

df <- cbind(do.call(rbind, strsplit(gsub('(.)(..)(...)', '\\1 \\2 \\3', paste(df[,1])),' ')), df[,-1]) # You need that paste() there because gsub() works only with text.

Or with substr()

df <- cbind(ID1=substr(df[, 1],1,1), ID2=substr(df[, 1],2,3), ID3=substr(df[, 1],4,6), df[, -1])
于 2013-03-19T11:39:58.107 に答える
4

これらは数値であるため、必要な数字を抽出するには、いくつかの計算を行う必要があります。基数 10 で表される数値は、次のように記述できます。

d0*10^0 + d1*10^1 + d2*10^2 ... etc. where d0..dn are the digits of the number.

したがって、数学的に次のように表される 6 桁の数値から最上位桁を抽出するには、次のようにします。

number = d5*10^5 + d4*10^4 + d3*10^3 + d2*10^2 + d1*10^1 + d0*10^0

ご覧のとおり、この数値を 10^5 で割ると、次のようになります。

number / 10^5 = d5*10^0 + d4*10^(-1) + d3*10^(-2) + d2*10^(-3) + d1*10^(-4) + d0*10^(-5)

出来上がり!結果を整数として解釈すると、最上位の桁が抽出されます。これは、他のすべての桁の重みが 0 未満になり、1 未満になるためです。他の桁を抽出するために同様のことができます。最下位桁の桁については、除算の代わりにモジュロ演算を実行できます。

例:

501901 / 10^5 = 5 // first digit
501901 % 10^5 = 1 // last digit
(501901 / 10^4) % 10^1 = 0 // second digit
(501901 / 10^2) % 10^2 = 19 // third and fourth digit
于 2013-03-19T11:47:30.317 に答える
3

何らかの理由で変換したくない場合はcharacter、次の方法で目的を達成できます。

DF <- data.frame(ID = c(501901, 501902), var1 = c("a", "b"), var2 = c("c", "d"))

result <- t(sapply(DF$ID, function(y) {
    c(y%/%1e+05, (y - y%/%1e+05 * 1e+05)%/%1000, y - y%/%1000 * 1000)
}))


DF <- cbind(result, DF[, -1])

names(DF)[1:3] <- c("ID1", "ID2", "ID3")

DF
##   ID1 ID2 ID3 var1 var2
## 1   5   1 901    a    c
## 2   5   1 902    b    d
于 2013-03-19T11:47:38.957 に答える
2

非常に多くの答えがあるので、何かを考え出す必要があるように感じました:)

library(qdap)
x <- colSplit(dat$ID_Var, col.sep="")
data.frame(ID1=x[, 1], ID2=paste2(x[, 2:3], sep=""), 
    ID3=paste2(x[, 4:6],sep=""), dat[, -1])

##   ID1 ID2 ID3 var1 var2 var3 var4  var5
## 1   5  01 901    9 SP.1    1    W 12.10
## 2   5  01 901    9 SP.1    2    W 17.68
于 2013-03-19T12:30:47.700 に答える