0

私は3つの列を持っています。最初の列には一意の ID があり、2 番目と 3 番目の列には文字列データといくつかの NA データがあります。列 2 から情報を抽出し、それを別の列に入れ、列 3 についても同じことを行う必要があります。 for ループを使用して、次のように関数を作成しています。3 番目の文字の後に列を分割する必要があります。[たとえば、下の V1 列では、AAAbbb を AAA と bbb に分割し、それらを別々の列に配置する必要があります。substr を使用してこれを行うことができることを知っています。私はRが初めてです、助けてください。


UID * V1 * V2 *


Z001NL * AAAbbb * IADSFO *


Z001NP * IADSFO * NA *


Z0024G * SFOHNL * NLSFO0 *


これが私のコードです。

test=read.csv("c:/some/path/in/windows/test.csv", header=TRUE)

substring_it = function(test)
{
for(i in 1:3){
for(j in 2:3){
answer = transform(test, code 1 = substr((test[[j,i]]), 1, 3), code2 = substr((test[j,i]), 4, 6))

}
}
return(answer)

}

hello = substring_it(test)

test は、読み込むデータ フレームになります。

出力としてこれが必要です


UID * V1.1 * V1.2 * V2.1 * V2.2


Z001NL * AAA * bbb * IAD * SFO


Z001NP * IAD * SFO * NA * NA


Z0024G * SFO * HNL * NLS * SFO


4

1 に答える 1

2

を使用sapplyして、ベクトルの各要素に関数を適用できます。これは、元のデータ フレーム (テスト) の列に対して sapply を使用して新しいデータ フレームの列を作成できるため、ここで役立ちます。

これを行うソリューションは次のとおりです。

test = data.frame(UID = c('Z001NL', 'Z001NP', 'Z0024G'), 
  V1 = c('AAAbbb', 'IADSFO', 'SFOHNL'),
  V2 = c('IADSFO', NA, 'NLSFO0'))

substring_it = function(x){
  # x is a data frame
  c1 = sapply(x[,2], function(x) substr(x, 1, 3))
  c2 = sapply(x[,2], function(x) substr(x, 4, 6))
  c3 = sapply(x[,3], function(x) substr(x, 1, 3))
  c4 = sapply(x[,3], function(x) substr(x, 4, 6))
  return(data.frame(UID=x[,1], c1, c2, c3, c4))
}

substring_it(test)
# returns:
#     UID  c1  c2   c3   c4
#1 Z001NL AAA bbb  IAD  SFO
#2 Z001NP IAD SFO <NA> <NA>
#3 Z0024G SFO HNL  NLS  FO0

編集:これを何度も行う必要がある場合は、列をループする方法があります。元のデータ フレームの列の順序と、新しいデータ フレームの列の最終的な順序がわからないため、「pos」カウンターをいじる必要があるかもしれません。また、分割される列は列 2 から 201 (「colindex」) であると仮定したため、おそらくそれを変更する必要があります。

newcolumns = list()
pos = 1 #counter for column index of new data frame
for(colindex in 2:201){
    newcolumns[[pos]] = sapply(test[,colindex], function(x) substr(x, 1, 3))
    newcolumns[[pos+1]] = sapply(test[,colindex], function(x) substr(x, 4, 6))
    pos = pos+2
}
newdataframe = data.frame(UID = test[,1], newcolumns)
# update "names(newdataframe)" as needed
于 2014-01-02T21:48:56.383 に答える