-1

私は3つの列を持っています。最初の列は完了していますが、2番目と3番目の列は不完全であり、3つの列すべての既存の値に基づいてそれらを完了したいと思います。次に例を示します。

number  a   b
1       Q   V
2       R   W
3       S   X
4       T   Y
5       U   Z
3       S   X
2       R   W
4       T   Y
1       Q   V
5       U   Z
4       
1       
5       
3       
2       
2       
4       
3       
5       
1

私がする必要があるのは、列「a」の最初の空の値に移動し、列「number」(4)の値を見て、「number」(4)に対応する「a」と「b」の値を見つけることです。 )、次にそれらの値を列「a」と「b」に挿入します。次に、不足している次の値に移動します。

私は2つのデータフレームを使用する1つの解決策に出くわしました。「df」と呼ばれる1つのデータフレームは、この投稿の冒頭に示されている元のテーブルであり、2番目のデータフレーム(「df2」と呼ばれる)はキーです。

number a b
1      Q V
2      R W
3      S X
4      T Y
5      U Z
3      S X
2      R W
4      T Y
1      Q V
5      U Z

次に、df1の値を使用してdfに値を入力できます。

df$a <- df2$a[ match(df$number, df2$number)]
df$b <- df2$b[ match(df$number, df2$number)]

これにより、新しいdfが次のようになります。

 number a b
1       Q V
2       R W
3       S X
4       T Y
5       U Z
3       S X
2       R W
4       T Y
1       Q V
5       U Z
4       T Y
1       Q V
5       U Z
3       S X
2       R W
2       R W
4       T Y
3       S X
5       U Z
1       Q V

これは私にとってはうまくいくようです!ただし、いくつかの未解決の問題/質問があります。

1)これを行うためのよりエレガントで効率的な方法はありますか?できれば単一のデータフレームdfのみを使用しますか?

2)「数値」を照合するために、このメソッドはその列の照合の最初のインスタンスを使用するだけですか?

3)既存の「a」と「b」の値が正しく割り当てられていることをテストする良い方法はありますか(つまり、同じ「番号」の各インスタンスは同じ「a」と「b」を持っています。これは質問#に関連しています2真上。

これについてアドバイスをありがとう!

4

3 に答える 3

2

ここで DWin の考えは正しいと思いますが、追加のデータ フレームを作成する理由はありません。「一致」関数は最初の一致のみを検出するため、残りのデータ フレームについて心配する必要はありません。彼のコードは次のように省略できます。

data[data$a=="",] <- data[match(data$number[data$a==""], data$number), ]

以上です。

このコードは平易な英語で、「'a' の値が欠落しているセットの行について、欠落している行の 'number' に一致する列 'number' の最初の行を見つけ、一致する行全体を古い行に書き込みます。行。"

于 2013-01-23T20:02:45.513 に答える
1

2つのdata.framesを作成します。

dat <- read.table(text="number  a   b
1       Q   V
2       R   W
3       S   X
4       T   Y
5       U   Z", header=TRUE)
bigger <-read.table(text="number  a   b
1       Q   V
2       R   W
3       S   X
4       T   Y
5       U   Z
3       S   X
2       R   W
4       T   Y
1       Q   V
5       U   Z
4       
1       
5       
3       
2       
2       
4       
3       
5       
1", header=TRUE, fill=TRUE)

次に、samllerの行から一致する行をプルして、欠落しているデータを埋めます。

bigger[bigger$a=="", ] <- dat[match( bigger$number[bigger$a==""], dat$number), ]
> bigger
   number a b
1       1 Q V
2       2 R W
3       3 S X
4       4 T Y
5       5 U Z
6       3 S X
7       2 R W
8       4 T Y
9       1 Q V
10      5 U Z
11      4 T Y
snipped output
于 2013-01-23T19:42:19.330 に答える
0

回答者がより正確に回答できるように、これらのデータをどのようにフィードするかを教えていただければ幸いです.

解決策のアイデアは python で提示されます。

class Sequence(object):       

    def __init__(self):

        self.D = {
                    1 : ['Q','V'],
                    2 : ['R','W'],
                    3 : ['S','X'],
                    4 : ['T','Y'],
                    5 : ['U','Z'],
                 }


    def add(self, val, *a_b):

        self.D[val] = [a_b[0],a_b[1]]


    def find(self, seed):

        ##  Add all the enteries you want to add in this dict.
        return self.D[seed]

    def ret_all(self):
        return self.D

# Initialize    
s = Sequence()

# Add new item
s.add(9,['M','V'])

# Find by index
cols = s.find(3)
print 'a col: ', cols[0]
print 'b col: ', cols[1]

# Show all the list
All = s.ret_all()

for i,v in All.items():
    print i, [v for x in v]  

それが欲しいかどうか教えてください。

于 2013-01-23T18:26:36.900 に答える