用行名替换数据框中的值

时间:2017-07-20 14:51:35

标签: r dataframe replace rows

我有一个如下所示的数据框:

         Jill Jimmie Alex Jane 
    Jill   1    0      1    1    
    Jimmie 0    1      1    0    
    Alex   0    1      1    0    
    Jane   1    1      1    0    

我想将每1更改为其对应的行名称,例如:

         Jill Jimmie Alex Jane 
    Jill Jill    0   Jill  Jill  
    Jimmie 0  Jimmie Jimmie 0   
    Alex   0   Alex  Alex   0   
    Jane Jane  Jane  Jane   0  

之后,我想从数据框中删除所有零并向上移动列中的值。

我试过了:

    # for (i in ibm_data){
    #   if (ibm_data == 1){
    #     names <- row.names(i)
    #     ibm_data[ibm_data == 1] <- names
    #   }
    #   else{
    #     ibm_data[ibm_data == 0] <- "NA"
    #   }
    # }

然后我会删除NA值,但我认为这使得过于复杂。我打算从名单列表中构建一个强制图,以查看相关性。

3 个答案:

答案 0 :(得分:1)

以下是replace/row

的一个选项
df1[] <- replace(row.names(df1)[row(df1)*(NA^!df1)], !df1, 0)
df1
#       Jill Jimmie   Alex Jane
#Jill   Jill      0   Jill Jill
#Jimmie    0 Jimmie Jimmie    0
#Alex      0   Alex   Alex    0
#Jane   Jane   Jane   Jane    0

想法是获取具有row函数的行的行索引,将原始data.frame中的0的索引替换为NA,使用该索引获取相应的行名,使用逻辑矩阵(replace!df1 NA设为0 - 如果有0值则返回TRUE,对于1则返回FALSE

或者更简单的方法是

df1[] <- replace(row.names(df1)[row(df1)], !df1, 0)

数据

df1 <- structure(list(Jill = c(1L, 0L, 0L, 1L), Jimmie = c(0L, 1L, 1L, 
1L), Alex = c(1L, 1L, 1L, 1L), Jane = c(1L, 0L, 0L, 0L)), .Names = c("Jill", 
"Jimmie", "Alex", "Jane"), class = "data.frame", row.names = c("Jill", 
"Jimmie", "Alex", "Jane"))

答案 1 :(得分:1)

虽然我喜欢@ akrun的单行,但我想发布更详细的答案:

k <- which(df==1, arr.ind=TRUE)
df[k] <- rownames(k)

df

#        Jill Jimmie   Alex Jane 
# Jill   Jill      0   Jill Jill 
# Jimmie    0 Jimmie Jimmie    0 
# Alex      0   Alex   Alex    0 
# Jane   Jane   Jane   Jane    0

<强> 数据

read.table(text='Jill Jimmie Alex Jane 
       Jill   1    0      1    1    
       Jimmie 0    1      1    0    
       Alex   0    1      1    0    
       Jane   1    1      1    0 ', header = T, quote ='"') -> df

答案 2 :(得分:1)

我认为这样可以完成填充单元格值的rownames为1以及从数据框中删除&#34;全部为零并向上移动列中的值。&#34;

这将返回一个命名列表,其中每个列表元素都是相应的列,值是列中值等于1的rownames。

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
---
<spring:eval var="containsValue" expression="yourList.contains(yourValue)" />

Contains (true or false): ${containsValue}