根据另一列中的值从多个列中选择项目

时间:2015-03-26 21:16:08

标签: r indexing dataframe

我的R中的数据框有点问题。这是我的数据帧的主管。

                         ID              X1 X2 X3     state
1 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     2
2 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     3
3 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     2
4 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     3
5 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     1
6 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     3

我想添加一个新列,其中包含列X1,X2,X3的列数,但它取决于状态列。所以我想,如果我的状态是1,我从X1列添加列号,如果我的状态是2,从X2添加到列号,如果我的状态是3,则从X3添加到列号。所以,它看起来像这样:

                         ID              X1 X2 X3     state age
1 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     2     56
2 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     3     57
3 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     2     55
4 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     3     57
5 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     1     69
6 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     3     70

我该怎么做?我尝试了ifelse和子集,但它不起作用:(

2 个答案:

答案 0 :(得分:1)

假设' dat'是数据帧的名称:

dat$age <- dat[ c("X1","X2", "X3" )][ cbind( seq_len(nrow(dat)), dat$state) ]

使用两列矩阵作为&#34; [&#34;一个基本的R索引策略。如果使用索引将不同行数或列的索引作为可能重复查找,那么您可以使用matchfindInterval来构建行或列向量。就像@DavidArenburg一样,我发现ifelse很笨重,特别是当选项数量增加时。

答案 1 :(得分:0)

ifelse在这种情况下运行正常。尝试类似:

dat <- read.table(text = "
ID              X1 X2 X3     state
1 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     2
2 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     3
3 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     2
4 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     3
5 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     1
6 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     3")

dat$age <- with(dat, ifelse(state == 1, X1, ifelse(state == 2, X2, X3)))

print(dat)
#                                      ID X1 X2 X3 state age
#1 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     2  56
#2 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     3  57
#3 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     2  55
#4 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     3  57
#5 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     1  69
#6 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     3  70

编辑如果您想使用索引,可以选择以下选项

dat$age2 <- dat[cbind(1:nrow(dat), dat$state + 1)]
print(dat)
#                                      ID X1 X2 X3 state age age2
#1 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     2  56   56
#2 {026560B0-E0BB-4479-832D-2F5EFFAD9E9F} 56 56 57     3  57   57
#3 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     2  55   55
#4 {04E6B096-A3CC-4C82-9E01-69BB3D6A0CEF} 55 55 57     3  57   57
#5 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     1  69   69
#6 {089E7170-E221-46D9-AE2B-3CD7FB1FEE0B} 69 70 70     3  70   70