根据分组变量,创建一个新的变量,该变量从现有数据框中取不同的列。

4

我很乐意为您翻译有关IT技术的内容。以下是需要翻译的文本:

在这段代码中,我不知道从哪里开始。我想将一个新变量附加到现有的数据框中,该变量取决于分组变量而定。例如,假设我有以下列:

    A  B  C  D  E  F
    1  2  3  6  11 12
    1  7  5  10 8  9
    2  19 2  4  5  6
    2  8  4  3  1  1

我希望添加一个新列 "G",如果 A 是 1,则为列 B,如果 A 是 2,则为列 D。

    A  B  C  D  E  F   G
    1  2  3  6  11 12  2 
    1  7  5  10 8  9   7
    2  19 2  4  5  6   4
    2  8  4  3  1  1   3

thanks

2个回答

9
这里有几种选择。
假设您的数据框称为DF
基本的[和索引。
# make everything in G =  B
DF$G <- DF$B
# replace those cases where A==2 with D
DF$G[DF$A==2] <- DF$D[DT$A==2]

使用 ifelse

只需要一个ifelse语句,因为A只能是1或2。

DF$G <- ifelse(DF$A==2, DF$D, DF$B)

使用data.table

我喜欢使用data.table,因为它具有内存效率和编码优雅性。

library(data.table)
# create a data.table with A as the key

DT <- data.table(DF, key = 'A')
# where the key (A) == 1 ], then assign G = B
DT[.(1), G := B]
# and where the key (A) == 2, then assign G = D
DT[.(2), G := D]

优美而优雅!

1
不错的data.table方法。+1 - A5C1D2H2I1M1N2O1R2T1
赞同,喜欢data.table。+1现在想知道的是,如何修改DT答案以从另一个数据表中分配一个列的值?也就是说,我有一个外部数据表B,其中包含我想要连接到原始数据表A的值,并且根据数据表A的某一列的值,我需要分配来自外部数据表B的一列或另一列? - DaveRGP

5
假设你的 data.frame 被称为 "mydf",你可以使用 ifelse:
within(mydf, {
  G <- ifelse(A == 1, B,
              ifelse(A == 2, D, 
                     0))
})
#   A  B C  D  E  F G
# 1 1  2 3  6 11 12 2
# 2 1  7 5 10  8  9 7
# 3 2 19 2  4  5  6 4
# 4 2  8 4  3  1  1 3

2
或者类似地,transform(mydf, G=ifelse(A==1, B, ifelse(A==2, D, NA))) - Josh O'Brien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接