-1

我有 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”对应的“a”和“b”的值(4 ),然后将这些值插入到“a”和“b”列中——然后转到下一个缺失值。

我遇到了一个使用两个数据框的解决方案。一个名为“df”的数据帧是本文开头显示的原始表格,第二个数据帧(称为“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 在这里有正确的想法,但没有理由创建额外的数据框。'match' 函数只找到第一个匹配项,因此我们不必担心数据帧的其余部分。你可以像这样缩写他的代码:

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

就是这样。

用简单的英语,这段代码说,“对于缺少 'a' 值的集合行,在缺少的行中找到与 'number' 匹配的列 'number' 的第一行,并将整个匹配行写入旧的排。”

于 2013-01-23T20:02:45.513 回答
1

构建两个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 回答