我的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和子集,但它不起作用:(
答案 0 :(得分:1)
假设' dat'是数据帧的名称:
dat$age <- dat[ c("X1","X2", "X3" )][ cbind( seq_len(nrow(dat)), dat$state) ]
使用两列矩阵作为&#34; [&#34;一个基本的R索引策略。如果使用索引将不同行数或列的索引作为可能重复查找,那么您可以使用match
或findInterval
来构建行或列向量。就像@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