嵌套for循环不';t跑在R

嵌套for循环不';t跑在R,r,for-loop,R,For Loop,我有一个数据集,其中所有变量都是二进制的(0,1)。我想将给定值保持为1,仅当其行中的所有其他后续值也为1时 为了演示,让我们假设一行看起来像这样:0001111我希望第四个对象保持为1。如果行看起来像这样:0100111,我希望第二个对象是0而不是1 我用if语句编写了一个嵌套for循环,但它没有运行(Rstudio被卡住): for(j/1:(ncol(df))) { 对于(i/1:(nrow(df))) { if(prod(df[i,j:ncol(df)])==1) { df[i,j]尽管

我有一个数据集,其中所有变量都是二进制的(0,1)。我想将给定值保持为1,仅当其行中的所有其他后续值也为1时

为了演示,让我们假设一行看起来像这样:0001111我希望第四个对象保持为1。如果行看起来像这样:0100111,我希望第二个对象是0而不是1

我用if语句编写了一个嵌套for循环,但它没有运行(Rstudio被卡住):

for(j/1:(ncol(df)))
{
对于(i/1:(nrow(df)))
{
if(prod(df[i,j:ncol(df)])==1)
{

df[i,j]尽管我没有在您的代码中查找错误,但我试图提供一种更优雅的解决方案:

for (j in 1:nrow(df)) {
  df[j,] <- consecutive_ones(df[j,])
}
以您提供的两个向量为例

df <- data.frame(var1 = c(0,0,0,1,1,1,1), var2 = c(0,1,0,0,1,1,1))
借助于purrr软件包(类似于lappy),我们可以将此功能应用于数据帧的列式

purrr::map_df(df, ~consecutive_ones(.x))


   var1  var2
  <dbl> <dbl>
1     0     0
2     0     0
3     0     0
4     1     0
5     1     1
6     1     1
7     1     1
purrr::map_-df(df,~连续的(.x))
var1 var2
1     0     0
2     0     0
3     0     0
4     1     0
5     1     1
6     1     1
7     1     1
注意:通过数据帧循环不是很有效,但我想这是唯一可行的方法

编辑:即使这不是矢量化的,也可能效率低下-我为您提供了一个按行解决方案:

for (j in 1:nrow(df)) {
  df[j,] <- consecutive_ones(df[j,])
}
for(1中的j:nrow(df)){

df[j,]尽管我没有在您的代码中查找错误,但我试图提供一种更优雅的解决方案:

for (j in 1:nrow(df)) {
  df[j,] <- consecutive_ones(df[j,])
}
以您提供的两个向量为例

df <- data.frame(var1 = c(0,0,0,1,1,1,1), var2 = c(0,1,0,0,1,1,1))
借助于purrr软件包(类似于lappy),我们可以将此功能应用于数据帧的列式

purrr::map_df(df, ~consecutive_ones(.x))


   var1  var2
  <dbl> <dbl>
1     0     0
2     0     0
3     0     0
4     1     0
5     1     1
6     1     1
7     1     1
purrr::map_-df(df,~连续的(.x))
var1 var2
1     0     0
2     0     0
3     0     0
4     1     0
5     1     1
6     1     1
7     1     1
注意:通过数据帧循环不是很有效,但我想这是唯一可行的方法

编辑:即使这不是矢量化的,也可能效率低下-我为您提供了一个按行解决方案:

for (j in 1:nrow(df)) {
  df[j,] <- consecutive_ones(df[j,])
}
for(1中的j:nrow(df)){

df[j,]我不完全确定为什么,但一旦我将数据帧转换成矩阵,代码就可以正常工作。您可以稍后将其更改回数据。帧

我不完全确定为什么,但一旦我将数据帧转换成矩阵,代码就可以正常工作。您可以稍后将其更改回数据。帧

我制作了一些示例数据:
set.seed(47);df=as.data.frame(matrix(sample(0:1,size=24,replace=TRUE),nrow=6))
并运行了您的代码-它工作得很好。您可以共享一些示例数据来重现问题吗?或者像我在这里做的那样共享代码来模拟示例数据,或者与
dput()共享您拥有的R对象
因此它是可复制粘贴的,并且保留了类/结构信息。例如,
dput(df[1:10,])
很高兴看到,共享
df
对象的前10行。谢谢。下面是一个指向数据帧块的链接:我制作了一些示例数据:
set.seed(47);df=as.data.frame(matrix(示例(0:1,size=24,replace=TRUE),nrow=6))
并运行了您的代码-它运行得很好。您可以共享一些示例数据吗?复制问题?或者像我在这里所做的那样共享代码以模拟示例数据,或者与
dput()共享您拥有的R对象
因此它是可复制粘贴的,并保留类/结构信息。例如,
dput(df[1:10,])
很高兴看到您共享
df
对象的前10行。谢谢。这是一个指向数据帧块的链接:感谢您花时间编写此内容。我相信这是为列而不是为行设置的?无论哪种方式,它似乎都不起作用。是的,这样它会遍历每列中的所有行。您希望它不起作用H通过每行的所有列?是的,所以在我的示例中,0,0,0,1,1,1,1和0,1,0,0,1,1,1是两行,有7个变量/列,而不是两列有7行。再次感谢提供编辑。我在我的一块数据上尝试了这一方法,效果很好,但一旦我运行了整个过程,它就会像我的原始代码一样卡住,所以我认为问题可能是在大多数情况下,您的解决方案和我的原始解决方案都效率低下,对于大型数据集来说速度太慢。是的,确实是我的解决方案(通过行循环)非常无效。我明天会尝试更多的方法感谢您花时间来写这篇文章。我相信这是为列设置的,而不是为行设置的?无论哪种方式,它似乎都不起作用。是的,这样它会遍历每列中的所有行。您希望它遍历每行的所有列吗?是的,因此在我的示例中,0,0,0,1,1,1和0,1,0,1,1,1都不是wo行,有7个变量/列,而不是两列,有7行。再次感谢您提供的编辑。我在我的一块数据上尝试了这一点,它工作正常,但一旦我运行了整个过程,它就会像我的原始代码一样卡住,所以我想问题可能是您的解决方案和我的原始解决方案对于大型数据集来说都效率低下,速度太慢。.是的,我的解决方案(在行中循环)确实非常无效。我明天会再试一些