2017-10-11 21 views
4

取代我有以下data.frame,列R中

dt2017 <- data.frame(id=LETTERS[1:4],year=2017,city1=c(0,1,0,1),city2=c(0,0,1,0), 
        city3=c(1,0,1,0),city4=c(0,0,0,0)) 

dt2017 
    id year city1 city2 city3 city4 
1: A 2017  0  0  1  0 
2: B 2017  1  0  0  0 
3: C 2017  0  1  1  0 
4: D 2017  1  0  0  0 

现在,我要像最后的结果:

id year city1 city2 city3 city4 
1: A 2017  0  0  A  0 
2: B 2017  B  0  0  0 
3: C 2017  0  C  C  0 
4: D 2017  D  0  0  0 

我怎样才能做到这一点?

+1

你可以尝试使用dplyr :: mutate_at与ifelse语句 – Chris

+3

@Chris你为什么要删除u解决方案。它的作用是'dt2017%>%mutate_at(vars(matches('city')),funs(ifelse(。== 1,as.character(dt2017 $ id),0)))' – akrun

+0

我只是想提供建议在评论中,不提供实际的代码。 – Chris

回答

4

我们复制“ID”列,使长度等于与“城市”栏目和replace在“城市”为0到“0”

dt2017[3:6] <- replace(matrix(dt2017$id[row(dt2017[3:6])], ncol=4), dt2017[3:6]==0, '0') 
dt2017 
# id year city1 city2 city3 city4 
#1 A 2017  0  0  A  0 
#2 B 2017  B  0  0  0 
#3 C 2017  0  C  C  0 
#4 D 2017  D  0  0  0 
+1

它的工作原理。非常感谢您的工作。 –

+0

@ X.Jun感谢您的回复。你也可以勾选[here](https://stackoverflow.com/help/someone-answers) – akrun

1

这里位置的另一种方法:

data[,3:6] <- t(sapply(1:nrow(data),function(i) ifelse(data[i,3:6],data[i,1],0))) 

输出:

id year city1 city2 city3 city4 
1 A 2017  0  0  A  0 
2 B 2017  B  0  0  0 
3 C 2017  0  C  C  0 
4 D 2017  D  0  0  0