Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用行名称替换数据帧中的值_R_Dataframe_Replace_Rows - Fatal编程技术网

R 用行名称替换数据帧中的值

R 用行名称替换数据帧中的值,r,dataframe,replace,rows,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

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

         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"
    #   }
    # }
#for(i在ibm#u数据中){
#如果(ibm_数据==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
数据
df1虽然我喜欢@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

我认为这既可以用1填充单元格值的行名,也可以删除“数据框中的所有零,并将列中的值上移”

这将返回一个命名列表,其中每个列表元素是对应的列,值是列中的值等于1的行名

lapply(dat, function(x) rownames(dat)[x==1])
$Jill
[1] "Jill" "Jane"

$Jimmie
[1] "Jimmie" "Alex"   "Jane"  

$Alex
[1] "Jill"   "Jimmie" "Alex"   "Jane"  

$Jane
[1] "Jill"

data.frame中单个列中的所有值必须具有相同的类,不能混合使用数字和字符对象。或者在前面的每一列中尝试使用
as.character
,并与
=“1”进行比较
。我是否在一个for循环中显示这一点,以运行我所有的数据,因为到目前为止我没有得到任何更改?@sgatta你的意思是你想要
for
循环解决方案吗?根据我显示的数据,它正在改变它正在工作!这是我这边的一个错误。我将标记你作为我的答案。谢谢!@sgatta尝试使用“数据”在我的帖子和代码中,检查您是否得到了预期的结果。可能是您的数据不是
数值
,可能是
因子
类?很快,名称会更改,但0仍然存在。如何删除它们并将值上移?
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
lapply(dat, function(x) rownames(dat)[x==1])
$Jill
[1] "Jill" "Jane"

$Jimmie
[1] "Jimmie" "Alex"   "Jane"  

$Alex
[1] "Jill"   "Jimmie" "Alex"   "Jane"  

$Jane
[1] "Jill"