我有一个如下所示的数据框:
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
值,但我认为这使得过于复杂。我打算从名单列表中构建一个强制图,以查看相关性。
答案 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}