来自Character类输入的R子集

时间:2018-01-19 19:52:17

标签: r dataframe type-conversion subset shiny

我有一个数据框st

Col | Val
d16 | 1
d17 | 1
d18 | 1

我已使用paste0来获取p1<-paste0(st$c, "==", st$val, sep="&", collapse = "")

给出“d16 == 1&amp; d17 == 1&amp; d18 == 1&amp;”然后创建

p2<-substr(p1, 1, nchar(p1)-1)摆脱p1中的最后一个&

执行所有这些操作的主要原因是,我有一个更大的数据集,我们称之为ST,其中包含d16d17d18列我希望使用以下命令对ST进行分组:

ST <- subset(ST, p2)

然而,当我尝试时,我得到Error in subset.data.frame(seg, p2) : 'subset' must be logical

哪个有意义,p2必须是LOGICAL类,而不是类CHAR。我尝试过使用as.logical,我尝试先将其转换为因子,然后使用as.logical。但那没用。我也试过使用eval(parse(text=p2)),但也没有运气。

如何更改p2以便在subset内使用?

背景 我想保持我想做的事情很简单,但我认为这会导致更多的混乱,所以我想解释为什么我甚至遇到了这个问题。

我真正在做的是一个闪亮的应用程序。我有ST看起来像

d16  d17  d18  t14  t15 t16 z15 z16 z20
1   1   0   1   1   1   1   1  1  0  0
2   1   0   0   1   0   0   0  0  1  0
3   0   1   0   1   1   0   1  1  1  1 
4   1   1   0   0   0   1   1  0  1  0

列的名称并不重要,但ST本质上有很多列,每个条目都是1或0.由于有很多列(100+),我希望用户预先选择他们想要查看原始数据的列。我的解决方案是使用带有'1','0'或'2'的单选按钮进行无选择。然后我会接受这些输入并创建一个值向量:val,并将其组合到一个数据框中,其列名来自ST,然后st来自所选的列:

val<-c(0,1,1,1,0,0,2,2,2)
c<-colnames(ST)
test<-data.frame(c,val)
st<-subset(test, val==1)

然后我试图使用

p1<-paste0(st$c, "==", st$val, sep="&", collapse = "")
p2<-substr(p1, 1, nchar(p1)-1)

这样我就可以将p2输入另一个subset函数。

2 个答案:

答案 0 :(得分:0)

如果你注定要坚持你的方法,那么确实创建p2作为一个包含规则的字符串已经朝着错误的方向迈出了一步,那么你可能真的需要做类似......

# example
eval(parse(text = "Day == 1"), envir = airquality)

# your case
eval(parse(text = p2), envir = ST)

...创建索引的逻辑向量,然后您甚至可以在简单的[下标中使用

编辑以下评论,显示角色条件的一种可能替代方法:

# assuming your st as above:
st <- data.frame(Col = c("d16", "d17", "d18"), Val = 1)

# transpose
st2 <- data.frame(t(st$Val))
colnames(st2) <- st$Col

st2
#  d16 d17 d18
#1   1   1   1

# merge (default arguments fit your case)
merge(ST, st2)

如果需要,您还可以将data.frames转换为data.tables,并对其执行相同的merge。即data.table::setDT(ST)data.table::setDT(st2)

答案 1 :(得分:0)

你在做什么子集?应该是问题。请记住,我们对列满足特定条件的行进行子集化。赋予subset函数的条件应包含以下列:

让我们举一个例子:

(dat=data.frame(d16=c(-1,1,1,3,4,5),d17=c(5,4,1,1,2,3),d18=1))
  d16 d17 d18
1  -1   5   1
2   1   4   1
3   1   1   1
4   3   1   1
5   4   2   1
6   5   3   1

这是我们的数据:在上面的数据中,我们希望获得d16=1&d17=1&d18=1行。我们可能有很多变量,因此我们可以使用您建议的粘贴方法:

subset(dat,eval(parse(text=paste0(ST$Col,"==",ST$Val,collapse = "&"))))
  d16 d17 d18
3   1   1   1

其中数据框ST的位置为:

ST
   Col Val
1 d16    1
2 d17    1
3 d18    1

您的问题出在您要分组的数据中。使用正确的数据,您可以执行子集。