首页 文章

R:如何匹配第1列中的值,并将第2列中的相邻值分配给第2列中的较低值

提问于
浏览
-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正上方 .

感谢您的任何建议!

3 回答

  • 1

    我认为DWin在这里有正确的想法,但没有理由创建额外的数据框架 . 'match'函数只查找第一个匹配项,因此我们不必担心数据帧的其余部分 . 您可以像这样缩写他的代码:

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

    就是这样 .

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

  • 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
    
  • 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]
    

    如果那就是你想要的,请告诉我 .

相关问题