如何使用循环基于现有表填充R数据框?循环代码不生效如何解决?
现有代码的问题
- 变量名不匹配:你原始数据框命名为
df,但循环里操作的对象是data,如果没提前执行data <- df的话,代码要么报错要么不会修改你的目标数据。 - 判断逻辑完全错误:if条件里所有索引都写死了
data[1,1],根本没用到循环变量i和j,相当于永远在拿第一行的第一、二、三列和自己比,条件恒成立;且第三个判断用了赋值符号=而非相等判断符号==,会直接修改第一行第三列的值,逻辑完全失效。 - 循环操作逻辑冲突:你在遍历过程中直接删除行
data<- data[-j,],而循环的上限是初始的nrow(data),后续会出现下标越界、行匹配混乱的问题,这类边遍历边删元素的写法本身就不推荐。 - 需求理解偏差:你要实现的是典型的长表转宽表操作,完全不需要写双重循环,用成熟的表格转换函数效率更高、逻辑更清晰。
正确实现方案
你需要的效果可以用tidyr的pivot_wider函数快速实现,代码如下:
# 没有安装依赖包先执行 install.packages("tidyverse") library(tidyverse) df<-tibble(id=c("ls1","ls1","ls2","ls4"), symbol=c("a","a","b","df"), var=c("-","gh","gh","lm")) result <- df %>% # 新增临时值列,用来填充到宽表对应位置 mutate(temp_val = var) %>% # 把var的唯一值转为新列,匹配不到的位置填充_ pivot_wider(names_from = var, values_from = temp_val, values_fill = "_") # 如果需要自定义列名(匹配你给出的示例输出列名),可以加这一步 colnames(result) <- c("id", "symbol", "ls1", "lsp10", "ls02", "ls6")
运行后得到的result就是你需要的格式。
内容的提问来源于stack exchange,提问作者minoo
相关产品推荐
相关产品推荐

