在R中迭代子集和换台表

发布于 2025-01-30 03:52:19 字数 1202 浏览 7 评论 0原文

我有这个表( inputdf ):

数值0
10.2
10.3
10.4
20.2
0.2 20.7
30.1

,我想获得此( outputddf ):

number1number2number2 0.2
0.20.20.1
0.1 0.30.7Na
0.4Nai i

已通过使用第1列中的数字进行循环迭代,然后按照该数字来子集,但是我有麻烦将结果附加到输出数据框中:

inputdf <- read.table("input.txt", sep="\t", header = TRUE)
outputdf <- data.frame()

i=1
total=3 ###user has to modify it

for(i in seq(1:total)) {
  cat("Collecting values for number", i, "\n")
  values <- subset(input, Number == i, select=c(Value))
  cbind(outputdf, NewColumn= values, )
  names(outputdf)[names(outputdf) == "NewColumn"] <- paste0("Number", i)
}

任何帮助或提示都将做得很好。提前致谢!

I have this table (inputdf):

NumberValue
10.2
10.3
10.4
20.2
20.7
30.1

and I want to obtain this (outputdf):

Number1Number2Number3
0.20.20.1
0.30.7NA
0.4NANA

I have tried it by iterating with a for loop through the numbers in column 1, then subsetting the dataframe by that number but I have troubles to append the result to an output dataframe:

inputdf <- read.table("input.txt", sep="\t", header = TRUE)
outputdf <- data.frame()

i=1
total=3 ###user has to modify it

for(i in seq(1:total)) {
  cat("Collecting values for number", i, "\n")
  values <- subset(input, Number == i, select=c(Value))
  cbind(outputdf, NewColumn= values, )
  names(outputdf)[names(outputdf) == "NewColumn"] <- paste0("Number", i)
}

Any help or hint will be very wellcomed. Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

早乙女 2025-02-06 03:52:19

tidyverse中,您可以为组的每个元素创建一个ID,然后使用tidyr :: pivot_wider

library(tidyverse)
dat %>% 
  group_by(Number) %>% 
  mutate(id = row_number()) %>% 
  pivot_wider(names_from = Number, names_prefix = "Number", values_from = "Value")

# A tibble: 3 × 4
      n Number1 Number2 Number3
  <int>   <dbl>   <dbl>   <dbl>
1     1     0.2     0.2     0.1
2     2     0.3     0.7    NA  
3     3     0.4    NA      NA 

base> base r中,相同的想法。创建ID列,然后重新设计为宽:

transform(dat, id = with(dat, ave(rep(1, nrow(dat)), Number, FUN = seq_along))) |>
  reshape(direction = "wide", timevar = "Number")

In the tidyverse, you can create an id for each element of the groups and then use tidyr::pivot_wider:

library(tidyverse)
dat %>% 
  group_by(Number) %>% 
  mutate(id = row_number()) %>% 
  pivot_wider(names_from = Number, names_prefix = "Number", values_from = "Value")

# A tibble: 3 × 4
      n Number1 Number2 Number3
  <int>   <dbl>   <dbl>   <dbl>
1     1     0.2     0.2     0.1
2     2     0.3     0.7    NA  
3     3     0.4    NA      NA 

in base R, same idea. Create the id column and then reshape to wide:

transform(dat, id = with(dat, ave(rep(1, nrow(dat)), Number, FUN = seq_along))) |>
  reshape(direction = "wide", timevar = "Number")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文