我经常使用以下方法将单行附加到数据帧。我真正喜欢它的一件事是它允许您附加一个简单的 dict 对象。例如:
# Creating an empty dataframe
df = pd.DataFrame(columns=['a', 'b'])
# Appending a row
df = df.append({ 'a': 1, 'b': 2 }, ignore_index=True)
Run Code Online (Sandbox Code Playgroud)
同样,我最喜欢的一点是代码非常干净并且只需要很少的行。现在我想推荐的替代方案是:
# Create the new row as its own dataframe
df_new_row = pd.DataFrame({ 'a': [1], 'b': [2] })
df = pd.concat([df, df_new_row])
Run Code Online (Sandbox Code Playgroud)
因此,之前的一行代码现在变成了两行,其中包含一个一次性变量和额外的内容,我在其中创建新的数据框。:( 有没有一种好方法可以做到这一点,只需使用像我过去那样的字典(未弃用)?
library(data.table)
dat1 <- data.table(id = c(1, 2, 34, 99),
class = c("sports", "", "music, sports", ""),
hobby = c("knitting, music, sports", "", "", "music"))
> dat1
id class hobby
1 1 sports knitting, music, sports
2 2
3 34 music, sports
4 99 music
Run Code Online (Sandbox Code Playgroud)
我有上面的数据集 ,dat1
其中每一行对应一个唯一的id
. 对于每个,或id
的多个输入以逗号分隔。class
hobby
我想交换此数据集的行和列,以便得到以下内容:
input class hobby
1 sports 1, 34 1
2 knitting 1
3 music 34 1, 99
Run Code Online (Sandbox Code Playgroud)
在此数据集中,每一行对应一个唯一的input
from dat1
。现在class
和hobby …
考虑以下数据框:
\ndummy_df <- tibble(\n A=c("ABC", "ABC", "BCD", "CDF", "CDF", "CDF"),\n B=c(0.25, 0.25, 1.23, 0.58, 0.58, 0.58),\n C=c("lorem", "ipsum", "dolor", "amet", "something", "else"),\n D=c("up", "up", "down", "down", "down", "down"),\n E=c(132, 132, 243, 512, 512, 512),\n F=c("m1", "m1", "m5", "m3", "m3", "m3"),\n G=c("val", "val", "mur", "mad", "mad", "mad"),\n H=c("grx", "grx", "bcn", "sal", "sal", "sal"),\n I=c(1.68, 1.68, 2.31, 3.12, 3.12, 3.12),\n J=c("p", "p", "f", "p", "p", "p"),\n K=c(100, 100, 200, 143, 143, 143)\n)\n\n# A tibble: 6 \xc3\x97 11\n A B C D …
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何改变 tidyrpivot_wider()
函数在生成的宽数据集中创建新变量名称的方式。具体来说,我希望将“names_from”变量添加到新变量的前缀而不是后缀。
我的数据集看起来像:
list(ID = c("A950", "A950", "A950", "A970", "A970", "A970", "A996", "A996", "A996"),
Phase = c("P1", "P2", "P3", "P1", "P2", "P3", "P1", "P2", "P3"),
A = c(23.5, 25.2, 21.9, 21.9, 21.1, 20.3, 19.5, 18.7, 17.9),
B = c(21.9, 21.1, 20.3, 19.5, 18.7, 17.9, 17.1, 16.3, 15.5),
C = c(25.2, 21.9, 20.3, 17.6, 15.1, 12.7, 10.3, 7.8, 5.4),
D = c("M", "M", "M", "F", "F", "F", "N", "N", "N"))
Run Code Online (Sandbox Code Playgroud)
当我使用pivot_wider()
Phase 作为“关键”来传播数据集时,我的结果如下所示:
ex_wide <- ex_long %>%
pivot_wider(names_from …
Run Code Online (Sandbox Code Playgroud) 好的,我已经尝试了太久了,是时候寻求帮助了。我有一个看起来有点像这样的数据框:
Run Code Online (Sandbox Code Playgroud)person fruit quantity all_fruits 0 p1 grapes 2 [grapes, banana] 1 p1 banana 1 [grapes, banana] 2 p2 apple 4 [apple, banana, peach] 3 p2 banana 4 [apple, banana, peach] 4 p2 peach 2 [apple, banana, peach] 5 p3 grapes 1 [grapes] 6 p4 banana 1 [banana] 7 p5 apple 3 [apple, peach] 8 p5 peach 2 [apple, peach]
然后我有一个“感兴趣的水果”列表:
Fruits_of_interest: ['苹果', '香蕉']
我需要做的是:
为每个感兴趣的水果创建一个列,并为第 1 列(人)上的每个人指定她是否有那个水果
对于第 1 列中的每个人,指定该人在该水果列下感兴趣的水果数量的 log(1+x)
我正在努力完成这项工作!我的实际数据框非常大,接近 80 万行,并且“感兴趣的水果”列表有 300 多个“水果”,这无济于事。
对于第一部分,我使用了这个函数,并且可以获取所有带有布尔值的列,以显示是否有水果:
Run Code Online (Sandbox Code Playgroud)def has_fruit(fruit, …
我需要按一个变量对数据框进行分组,然后通过添加相对于另一个变量的 0.25、.5、0.75 分位数的数字或行(我已经可以这样做)和列数对其进行汇总。
在 RI 中会做例如:
iris %>%
group_by(Species) %>%
summarise(
quantile(Sepal.Length, c(.25, .75)) %>%
matrix(nrow = 1) %>%
as.data.frame() %>%
setNames(paste0("Sepal.Length", c(.25, .75)))
)
Run Code Online (Sandbox Code Playgroud)
使用 DataFrames 和 DataFrameMeta 在 Julia 中编写此代码的简洁方法是什么?如果有一个解决方案可以将它一次应用于多个列,那就更好了。
我能在 Julia 中找到的最接近的解决方案是:
groupby(iris, :Species) |>
x -> combine(x, :Sepal.Length => x -> [[map(p -> quantile(x, p), (Q25 = 0.25, Q75 = 0.75))] |> DataFrame])
Run Code Online (Sandbox Code Playgroud)
但它只是将数据帧封装到一个单元格中,而它应该将其分散到多列中。
示例数据框:
no <- rep(1:5, each=2)
type <- rep(LETTERS[1:2], times=5)
set.seed(4)
value <- round(runif(10, 10, 30))
df <- data.frame(no, type, value)
Run Code Online (Sandbox Code Playgroud)
df
no type value
1 1 A 22
2 1 B 10
3 2 A 16
4 2 B 16
5 3 A 26
6 3 B 15
7 4 A 24
8 4 B 28
9 5 A 29
10 5 B 11
Run Code Online (Sandbox Code Playgroud)
现在我想要的是计算每种类型(A 或 B)的 % 值并创建单独的列。期望的输出是这样的:
no pct_A pct_B total_value
1 1 68.75000 31.25000 32
2 2 …
Run Code Online (Sandbox Code Playgroud) 我有一个数据集,其中人们的完整年龄为 R 中的字符串(例如,“10 年 8 个月 23 天)”,我需要将其转换为有意义的数字变量。我正在考虑将其转换为有多少天人的年龄(这很困难,因为月份有不同的天数)。因此,最好的解决方案可能是创建一个双变量,将年龄显示为 10.6 或 10.8,一些数字变量携带 10 年 8 个月 5 天大于的信息10年7月12天。
这是我当前变量的示例
library(tibble)
age <- tibble(complete_age =
c("10 years 8 months 23 days",
"9 years 11 months 7 days",
"11 years 3 months 1 day",
"8 years 6 months 12 days"))
age
# A tibble: 4 x 1
complete_age
<chr>
1 10 years 8 months 23 days
2 9 years 11 months 7 days
3 11 years 3 months 1 day
4 8 years …
Run Code Online (Sandbox Code Playgroud) 我正在尝试计算多列的行平均值。有人可以解释为什么下面的代码只计算代码中两个变量(var_1 和 var_13)的平均值,而不是所有 13 列的平均值吗?
df %>%
rowwise() %>%
mutate(varmean = mean(var_1:var_13)) -> df
Run Code Online (Sandbox Code Playgroud) 我发现很难用语言解释我想要实现的目标,所以请不要因为我展示了一个简单的例子而评判我。我有一个看起来像这样的表:
主列 | 一些元数据 | 价值 |
---|---|---|
这 | 真的 | 10 |
这 | 错误的 | 3 |
那 | 真的 | 50 |
那 | 错误的 | 10 |
其他 | 真的 | 20 |
其他 | 错误的 | 5 |
我想针对 的每种情况分别标准化这些数据main_col
。例如,如果我们选择最小-最大归一化并将其缩放到范围 [0; 100],我希望输出如下所示:
主列 | 一些元数据 | 值(标准化) |
---|---|---|
这 | 真的 | 100 |
这 | 错误的 | 30 |
那 | 真的 | 100 |
那 | 错误的 | 20 |
其他 | 真的 | 100 |
其他 | 错误的 | 25 |
其中对于 的每种情况main_col
,最高值缩放为 100,另一个值按相应比例缩放。
data-wrangling ×10
r ×6
dataframe ×5
dplyr ×3
pandas ×3
python ×3
aggregate ×1
data-munging ×1
data-science ×1
data.table ×1
function ×1
group-by ×1
julia ×1
lubridate ×1
reshape ×1
stringr ×1
tidyr ×1